1- use super :: { Error , ParamList , ResultList , ValueKind } ;
1+ use super :: { Error , ParamList , ResultList , ValueKind , VariableId } ;
22use crate :: ast:: toposort:: toposort;
33use crate :: * ;
44use anyhow:: { anyhow, bail, Result } ;
@@ -186,6 +186,7 @@ impl<'a> Resolver<'a> {
186186 docs : Docs :: default ( ) ,
187187 document : doc,
188188 functions : IndexMap :: new ( ) ,
189+ wildcard : None ,
189190 } ) ;
190191 DocumentItem :: Interface ( id)
191192 } ) ;
@@ -205,6 +206,7 @@ impl<'a> Resolver<'a> {
205206 docs : Docs :: default ( ) ,
206207 document : doc,
207208 functions : IndexMap :: new ( ) ,
209+ wildcard : None ,
208210 } )
209211 } ) ,
210212 } ;
@@ -531,6 +533,7 @@ impl<'a> Resolver<'a> {
531533 name : name. map ( |s| s. to_string ( ) ) ,
532534 functions : IndexMap :: new ( ) ,
533535 types : IndexMap :: new ( ) ,
536+ wildcard : None ,
534537 } ) ;
535538 if let Some ( name) = name {
536539 self . document_interfaces [ document. index ( ) ]
@@ -563,11 +566,21 @@ impl<'a> Resolver<'a> {
563566 match field {
564567 ast:: InterfaceItem :: Value ( value) => match & value. kind {
565568 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+ } ;
571584 assert ! ( prev. is_none( ) ) ;
572585 }
573586 } ,
@@ -646,7 +659,9 @@ impl<'a> Resolver<'a> {
646659 name : Some ( def. name . name . to_string ( ) ) ,
647660 owner,
648661 } ) ;
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) ) ?;
650665 }
651666 Ok ( ( ) )
652667 }
@@ -675,7 +690,7 @@ impl<'a> Resolver<'a> {
675690 name : Some ( name. name . to_string ( ) ) ,
676691 owner,
677692 } ) ;
678- self . define_interface_name ( name, TypeOrItem :: Type ( id) ) ?;
693+ self . define_interface_name ( name. name , name . span , TypeOrItem :: Type ( id) ) ?;
679694 }
680695 Ok ( ( ) )
681696 }
@@ -758,12 +773,12 @@ impl<'a> Resolver<'a> {
758773 }
759774 }
760775
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) ) ;
763778 if prev. is_some ( ) {
764779 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) ,
767782 }
768783 . into ( ) )
769784 } else {
0 commit comments