@@ -20,6 +20,7 @@ use dupe::Dupe;
2020use starlark_derive:: type_matcher;
2121
2222use crate as starlark;
23+ use crate :: register_type_matcher;
2324use crate :: typing:: starlark_value:: TyStarlarkValue ;
2425use crate :: values:: UnpackValue ;
2526use crate :: values:: Value ;
@@ -35,6 +36,7 @@ use crate::values::tuple::value::Tuple;
3536use crate :: values:: types:: int:: int_or_big:: StarlarkIntRef ;
3637use crate :: values:: typing:: type_compiled:: matcher:: TypeMatcher ;
3738use crate :: values:: typing:: type_compiled:: matcher:: TypeMatcherBox ;
39+ use crate :: values:: typing:: type_compiled:: matcher:: TypeMatcherRegistered ;
3840
3941#[ derive( Clone , Copy , Dupe , Allocative , Debug ) ]
4042pub ( crate ) struct IsAny ;
@@ -83,7 +85,11 @@ impl TypeMatcher for IsList {
8385#[ derive( Clone , Allocative , Debug ) ]
8486pub ( crate ) struct IsListOf < I : TypeMatcher > ( pub ( crate ) I ) ;
8587
86- #[ type_matcher]
88+ unsafe impl < I : TypeMatcher > TypeMatcherRegistered for IsListOf < I > { }
89+ register_type_matcher ! ( IsListOf <IsStr >) ;
90+ register_type_matcher ! ( IsListOf <StarlarkTypeIdMatcher >) ;
91+ register_type_matcher ! ( IsListOf <TypeMatcherBox >) ;
92+
8793impl < I : TypeMatcher > TypeMatcher for IsListOf < I > {
8894 fn matches ( & self , value : Value ) -> bool {
8995 match ListRef :: from_value ( value) {
@@ -96,7 +102,10 @@ impl<I: TypeMatcher> TypeMatcher for IsListOf<I> {
96102#[ derive( Clone , Allocative , Debug ) ]
97103pub ( crate ) struct IsTupleOf < A : TypeMatcher > ( pub ( crate ) A ) ;
98104
99- #[ type_matcher]
105+ unsafe impl < A : TypeMatcher > TypeMatcherRegistered for IsTupleOf < A > { }
106+ register_type_matcher ! ( IsTupleOf <StarlarkTypeIdMatcher >) ;
107+ register_type_matcher ! ( IsTupleOf <TypeMatcherBox >) ;
108+
100109impl < A : TypeMatcher > TypeMatcher for IsTupleOf < A > {
101110 fn matches ( & self , value : Value ) -> bool {
102111 match Tuple :: from_value ( value) {
@@ -137,7 +146,9 @@ impl TypeMatcher for IsTupleElems0 {
137146#[ derive( Clone , Allocative , Debug ) ]
138147pub ( crate ) struct IsTupleElems1 < A : TypeMatcher > ( pub ( crate ) A ) ;
139148
140- #[ type_matcher]
149+ unsafe impl < A : TypeMatcher > TypeMatcherRegistered for IsTupleElems1 < A > { }
150+ register_type_matcher ! ( IsTupleElems1 <TypeMatcherBox >) ;
151+
141152impl < A : TypeMatcher > TypeMatcher for IsTupleElems1 < A > {
142153 fn matches ( & self , value : Value ) -> bool {
143154 match Tuple :: from_value ( value) . map ( |t| t. content ( ) ) {
@@ -150,7 +161,10 @@ impl<A: TypeMatcher> TypeMatcher for IsTupleElems1<A> {
150161#[ derive( Clone , Allocative , Debug ) ]
151162pub ( crate ) struct IsTupleElems2 < A : TypeMatcher , B : TypeMatcher > ( pub ( crate ) A , pub ( crate ) B ) ;
152163
153- #[ type_matcher]
164+ unsafe impl < A : TypeMatcher , B : TypeMatcher > TypeMatcherRegistered for IsTupleElems2 < A , B > { }
165+ register_type_matcher ! ( IsTupleElems2 <StarlarkTypeIdMatcher , StarlarkTypeIdMatcher >) ;
166+ register_type_matcher ! ( IsTupleElems2 <TypeMatcherBox , TypeMatcherBox >) ;
167+
154168impl < A : TypeMatcher , B : TypeMatcher > TypeMatcher for IsTupleElems2 < A , B > {
155169 fn matches ( & self , value : Value ) -> bool {
156170 match Tuple :: from_value ( value) . map ( |t| t. content ( ) ) {
@@ -173,7 +187,15 @@ impl TypeMatcher for IsDict {
173187#[ derive( Clone , Allocative , Debug ) ]
174188pub ( crate ) struct IsDictOf < K : TypeMatcher , V : TypeMatcher > ( pub ( crate ) K , pub ( crate ) V ) ;
175189
176- #[ type_matcher]
190+ unsafe impl < K : TypeMatcher , V : TypeMatcher > TypeMatcherRegistered for IsDictOf < K , V > { }
191+ register_type_matcher ! ( IsDictOf <IsStr , TypeMatcherBox >) ;
192+ register_type_matcher ! ( IsDictOf <StarlarkTypeIdMatcher , TypeMatcherBox >) ;
193+ register_type_matcher ! ( IsDictOf <TypeMatcherBox , TypeMatcherBox >) ;
194+ register_type_matcher ! ( IsDictOf <IsAny , TypeMatcherBox >) ;
195+ register_type_matcher ! ( IsDictOf <TypeMatcherBox , IsAny >) ;
196+ register_type_matcher ! ( IsDictOf <IsStr , IsAny >) ;
197+ register_type_matcher ! ( IsDictOf <StarlarkTypeIdMatcher , IsAny >) ;
198+
177199impl < K : TypeMatcher , V : TypeMatcher > TypeMatcher for IsDictOf < K , V > {
178200 fn matches ( & self , value : Value ) -> bool {
179201 match DictRef :: from_value ( value) {
@@ -198,7 +220,11 @@ impl TypeMatcher for IsSet {
198220#[ derive( Clone , Allocative , Debug ) ]
199221pub ( crate ) struct IsSetOf < I : TypeMatcher > ( pub ( crate ) I ) ;
200222
201- #[ type_matcher]
223+ unsafe impl < I : TypeMatcher > TypeMatcherRegistered for IsSetOf < I > { }
224+ register_type_matcher ! ( IsSetOf <IsStr >) ;
225+ register_type_matcher ! ( IsSetOf <StarlarkTypeIdMatcher >) ;
226+ register_type_matcher ! ( IsSetOf <TypeMatcherBox >) ;
227+
202228impl < I : TypeMatcher > TypeMatcher for IsSetOf < I > {
203229 fn matches ( & self , value : Value ) -> bool {
204230 match SetRef :: unpack_value_opt ( value) {
@@ -211,7 +237,14 @@ impl<I: TypeMatcher> TypeMatcher for IsSetOf<I> {
211237#[ derive( Clone , Allocative , Debug ) ]
212238pub ( crate ) struct IsAnyOfTwo < A : TypeMatcher , B : TypeMatcher > ( pub ( crate ) A , pub ( crate ) B ) ;
213239
214- #[ type_matcher]
240+ unsafe impl < A : TypeMatcher , B : TypeMatcher > TypeMatcherRegistered for IsAnyOfTwo < A , B > { }
241+ register_type_matcher ! ( IsAnyOfTwo <IsNone , IsStr >) ;
242+ register_type_matcher ! ( IsAnyOfTwo <IsNone , IsInt >) ;
243+ register_type_matcher ! ( IsAnyOfTwo <IsNone , StarlarkTypeIdMatcher >) ;
244+ register_type_matcher ! ( IsAnyOfTwo <IsNone , IsList >) ;
245+ register_type_matcher ! ( IsAnyOfTwo <IsNone , TypeMatcherBox >) ;
246+ register_type_matcher ! ( IsAnyOfTwo <TypeMatcherBox , TypeMatcherBox >) ;
247+
215248impl < A : TypeMatcher , B : TypeMatcher > TypeMatcher for IsAnyOfTwo < A , B > {
216249 fn matches ( & self , value : Value ) -> bool {
217250 self . 0 . matches ( value) || self . 1 . matches ( value)
0 commit comments