@@ -79,6 +79,7 @@ typedef CAbstract = {> CNamedType,
79
79
var t : TType ;
80
80
var from : Array <TType >;
81
81
var to : Array <TType >;
82
+ var forwards : Map <String ,Bool >;
82
83
}
83
84
84
85
class Completion {
@@ -237,6 +238,7 @@ class CheckerTypes {
237
238
t : null ,
238
239
from : [],
239
240
to : [],
241
+ forwards : new Map (),
240
242
};
241
243
addMeta (a ,ta );
242
244
for ( p in a .params )
@@ -250,6 +252,11 @@ class CheckerTypes {
250
252
for ( t in a .to )
251
253
if ( t .field == null )
252
254
ta .to .push (makeXmlType (t .t ));
255
+ for ( m in a .meta )
256
+ if ( m .name == " :forward" && m .params != null ) {
257
+ for ( i in m .params )
258
+ ta .forwards .set (i , true );
259
+ }
253
260
localParams = null ;
254
261
});
255
262
types .set (a .path , CTAbstract (ta ));
@@ -855,6 +862,11 @@ class Checker {
855
862
case TFun (args , ret ):
856
863
if ( isCompletion )
857
864
fields .push ({ name : " bind" , t : TFun (args ,TVoid ) });
865
+ case TAbstract (a ,pl ):
866
+ for ( v in a .forwards .keys () ) {
867
+ var t = getField (apply (a .t , a .params , pl ), v , null , false );
868
+ fields .push ({ name : v , t : t });
869
+ }
858
870
default :
859
871
}
860
872
return fields ;
@@ -899,6 +911,8 @@ class Checker {
899
911
if ( af .name == f )
900
912
return af .t ;
901
913
return null ;
914
+ case TAbstract (a ,pl ) if ( a .forwards .exists (f ) ):
915
+ return getField (apply (a .t , a .params , pl ), f , e , forWrite );
902
916
default :
903
917
return null ;
904
918
}
0 commit comments