1
- use super :: { Error , ParamList , ResultList , ValueKind } ;
1
+ use super :: { Error , ParamList , ResultList , ValueKind , VariableId } ;
2
2
use crate :: ast:: toposort:: toposort;
3
3
use crate :: * ;
4
4
use anyhow:: { anyhow, bail, Result } ;
@@ -186,6 +186,7 @@ impl<'a> Resolver<'a> {
186
186
docs : Docs :: default ( ) ,
187
187
document : doc,
188
188
functions : IndexMap :: new ( ) ,
189
+ wildcard : None ,
189
190
} ) ;
190
191
DocumentItem :: Interface ( id)
191
192
} ) ;
@@ -205,6 +206,7 @@ impl<'a> Resolver<'a> {
205
206
docs : Docs :: default ( ) ,
206
207
document : doc,
207
208
functions : IndexMap :: new ( ) ,
209
+ wildcard : None ,
208
210
} )
209
211
} ) ,
210
212
} ;
@@ -531,6 +533,7 @@ impl<'a> Resolver<'a> {
531
533
name : name. map ( |s| s. to_string ( ) ) ,
532
534
functions : IndexMap :: new ( ) ,
533
535
types : IndexMap :: new ( ) ,
536
+ wildcard : None ,
534
537
} ) ;
535
538
if let Some ( name) = name {
536
539
self . document_interfaces [ document. index ( ) ]
@@ -563,11 +566,21 @@ impl<'a> Resolver<'a> {
563
566
match field {
564
567
ast:: InterfaceItem :: Value ( value) => match & value. kind {
565
568
ValueKind :: Func ( func) => {
566
- self . define_interface_name ( & value. name , TypeOrItem :: Item ( "function" ) ) ?;
567
- let func = self . resolve_function ( & value. docs , value. name . name , func) ?;
568
- let prev = self . interfaces [ interface_id]
569
- . functions
570
- . insert ( value. name . name . to_string ( ) , func) ;
569
+ if !matches ! ( value. name, VariableId :: Wildcard ( _) ) {
570
+ self . define_interface_name (
571
+ value. name ( ) ,
572
+ value. span ( ) ,
573
+ TypeOrItem :: Item ( "function" ) ,
574
+ ) ?;
575
+ }
576
+ let func = self . resolve_function ( & value. docs , value. name ( ) , func) ?;
577
+ let prev = if matches ! ( value. name, VariableId :: Wildcard ( _) ) {
578
+ self . interfaces [ interface_id] . wildcard . replace ( func)
579
+ } else {
580
+ self . interfaces [ interface_id]
581
+ . functions
582
+ . insert ( value. name ( ) . to_string ( ) , func)
583
+ } ;
571
584
assert ! ( prev. is_none( ) ) ;
572
585
}
573
586
} ,
@@ -646,7 +659,9 @@ impl<'a> Resolver<'a> {
646
659
name : Some ( def. name . name . to_string ( ) ) ,
647
660
owner,
648
661
} ) ;
649
- self . define_interface_name ( & def. name , TypeOrItem :: Type ( id) ) ?;
662
+ let name = def. name . name ;
663
+ let span = def. name . span ;
664
+ self . define_interface_name ( name, span, TypeOrItem :: Type ( id) ) ?;
650
665
}
651
666
Ok ( ( ) )
652
667
}
@@ -675,7 +690,7 @@ impl<'a> Resolver<'a> {
675
690
name : Some ( name. name . to_string ( ) ) ,
676
691
owner,
677
692
} ) ;
678
- self . define_interface_name ( name, TypeOrItem :: Type ( id) ) ?;
693
+ self . define_interface_name ( name. name , name . span , TypeOrItem :: Type ( id) ) ?;
679
694
}
680
695
Ok ( ( ) )
681
696
}
@@ -758,12 +773,12 @@ impl<'a> Resolver<'a> {
758
773
}
759
774
}
760
775
761
- fn define_interface_name ( & mut self , name : & ast :: Id < ' a > , item : TypeOrItem ) -> Result < ( ) > {
762
- let prev = self . type_lookup . insert ( name. name , ( item, name . span ) ) ;
776
+ fn define_interface_name ( & mut self , name : & ' a str , span : Span , item : TypeOrItem ) -> Result < ( ) > {
777
+ let prev = self . type_lookup . insert ( name, ( item, span) ) ;
763
778
if prev. is_some ( ) {
764
779
Err ( Error {
765
- span : name . span ,
766
- msg : format ! ( "name `{}` is defined more than once" , name. name ) ,
780
+ span,
781
+ msg : format ! ( "name `{}` is defined more than once" , name) ,
767
782
}
768
783
. into ( ) )
769
784
} else {
0 commit comments