@@ -214,6 +214,9 @@ impl Node for FuncCallNode {
214214 _ => return Err ( ctx. add_diag ( self . range . new_err ( ErrorCode :: FUNCTION_NOT_FOUND ) ) ) ,
215215 } ;
216216
217+ if let Some ( p) = & self . generic_params {
218+ p. emit_highlight ( ctx) ;
219+ }
217220 generic_tp_apply ( & fnvalue, self , ctx, builder) ?;
218221 let mut skip = 0 ;
219222 let mut para_values = vec ! [ ] ;
@@ -299,6 +302,7 @@ impl Node for FuncCallNode {
299302 res
300303 }
301304}
305+
302306/// # generic_tp_apply
303307///
304308/// This method will apply generic parameter types to a generic custom type.
@@ -308,13 +312,24 @@ pub fn generic_tp_apply<'a, 'b, T: Generic + CustomType, N: GenericInferenceAble
308312 ctx : & ' b mut Ctx < ' a > ,
309313 builder : & ' b BuilderEnum < ' a , ' _ > ,
310314) -> Result < ( ) , PLDiag > {
311- // disable highlight
312- * ctx. need_highlight . borrow_mut ( ) += 1 ;
313315 let generic_size = tp. get_generic_size ( ) ;
314316 let generic_params = node. get_generic_params ( ) ;
317+ // disable highlight
318+ * ctx. need_highlight . borrow_mut ( ) += 1 ;
315319 let range = node. range ( ) ;
316- let mut generic_types = preprocess_generics ( generic_params, generic_size, range, ctx, builder) ?;
317-
320+ let re = preprocess_generics (
321+ generic_params,
322+ generic_size,
323+ tp. get_user_generic_size ( ) ,
324+ range,
325+ ctx,
326+ builder,
327+ ) ;
328+ if let Err ( diag) = re {
329+ * ctx. need_highlight . borrow_mut ( ) -= 1 ;
330+ return Err ( diag) ;
331+ }
332+ let mut generic_types = re. unwrap ( ) ;
318333 let re = ctx. run_in_type_mod ( tp, |ctx, t| {
319334 ctx. protect_generic_context ( t. get_generic_map ( ) , |ctx| {
320335 for ( i, ( _, pltype) ) in t. get_generic_map ( ) . iter ( ) . enumerate ( ) {
@@ -329,7 +344,7 @@ pub fn generic_tp_apply<'a, 'b, T: Generic + CustomType, N: GenericInferenceAble
329344 . unwrap_or_default ( )
330345 . get ( i)
331346 . map ( |v| {
332- let ty = ctx. unify_table . borrow_mut ( ) . probe ( * v) ;
347+ let ty = ctx. unify_table . borrow_mut ( ) . probe_value ( * v) ;
333348 ty. get_type ( ctx, builder, & mut ctx. unify_table . clone ( ) . borrow_mut ( ) )
334349 } ) ;
335350 if let Some ( ty) = ty {
@@ -355,6 +370,14 @@ pub fn generic_tp_apply<'a, 'b, T: Generic + CustomType, N: GenericInferenceAble
355370 format_label ! ( "parameter `{}` defined in `{}`" , g. 0 , t. get_name( ) ) ,
356371 ) ;
357372 return Err ( diag. add_to_ctx ( ctx) ) ;
373+ } else if i < t. get_user_generic_size ( ) {
374+ ctx. set_if_refs_tp (
375+ generic_types[ i] . as_ref ( ) . unwrap ( ) . clone ( ) ,
376+ generic_params
377+ . as_ref ( )
378+ . and_then ( |v| v. generics [ i] . as_ref ( ) . map ( |v| v. range ( ) ) )
379+ . unwrap_or_default ( ) ,
380+ ) ;
358381 }
359382 }
360383 Ok ( ( ) )
@@ -370,14 +393,15 @@ pub fn generic_tp_apply<'a, 'b, T: Generic + CustomType, N: GenericInferenceAble
370393fn preprocess_generics < ' a , ' b > (
371394 generic_params : & Option < Box < GenericParamNode > > ,
372395 generic_size : usize ,
396+ usr_generic_size : usize ,
373397 range : Range ,
374398 ctx : & ' b mut Ctx < ' a > ,
375399 builder : & ' b BuilderEnum < ' a , ' _ > ,
376400) -> Result < Vec < Option < Arc < RefCell < PLType > > > > , PLDiag > {
377401 let generic_params = if let Some ( generic_params) = generic_params {
378402 generic_params. emit_highlight ( ctx) ;
379403 let generic_params_range = generic_params. range ;
380- if generic_params. generics . len ( ) != generic_size {
404+ if generic_params. generics . len ( ) != usr_generic_size {
381405 return Err (
382406 ctx. add_diag ( generic_params_range. new_err ( ErrorCode :: GENERIC_PARAM_LEN_MISMATCH ) )
383407 ) ;
@@ -389,7 +413,10 @@ fn preprocess_generics<'a, 'b>(
389413 range,
390414 } )
391415 } ;
392- let generic_types = generic_params. get_generic_types ( ctx, builder) ?;
416+ let mut generic_types = generic_params. get_generic_types ( ctx, builder) ?;
417+ if generic_types. len ( ) != generic_size {
418+ generic_types. resize ( generic_size, None ) ;
419+ }
393420 Ok ( generic_types)
394421}
395422
@@ -1034,7 +1061,7 @@ impl Node for ClosureNode {
10341061 typenode. emit_highlight ( ctx) ;
10351062 typenode. get_type ( ctx, builder, true ) ?
10361063 } else if let Some ( id) = v. id {
1037- let vv = ctx. unify_table . borrow_mut ( ) . probe ( id) ;
1064+ let vv = ctx. unify_table . borrow_mut ( ) . probe_value ( id) ;
10381065 let tp = vv. get_type ( ctx, builder, & mut ctx. unify_table . clone ( ) . borrow_mut ( ) ) ;
10391066 if * tp. borrow ( ) == PLType :: Unknown {
10401067 v. range ( )
@@ -1078,7 +1105,7 @@ impl Node for ClosureNode {
10781105 ret. emit_highlight ( ctx) ;
10791106 ret. get_type ( ctx, builder, true ) ?
10801107 } else if let Some ( ty) = self . ret_id {
1081- let v = ctx. unify_table . borrow_mut ( ) . probe ( ty) ;
1108+ let v = ctx. unify_table . borrow_mut ( ) . probe_value ( ty) ;
10821109 let tp = v. get_type ( ctx, builder, & mut ctx. unify_table . clone ( ) . borrow_mut ( ) ) ;
10831110 tp
10841111 } else if let Some ( exp_ty) = & ctx. expect_ty {
0 commit comments