@@ -443,14 +443,21 @@ pub struct StructDefNode {
443
443
pub id : Box < VarNode > ,
444
444
445
445
/// fields is all fields of a structure, the order follows the code order from top to bottom
446
- pub fields : Vec < StructField > ,
446
+ pub fields : Vec < ParsedField > ,
447
447
448
448
/// generics stands for the generics arguments in the structure
449
449
pub generics : Option < Box < GenericDefNode > > ,
450
450
451
451
/// modifier indicates whether the trait is decorated by a keyword `pub`
452
452
pub modifier : Option < ( TokenType , Range ) > ,
453
453
}
454
+
455
+ #[ derive( Clone , PartialEq , Eq , Debug ) ]
456
+ pub enum ParsedField {
457
+ Normal ( StructField ) ,
458
+ Err ( Box < NodeEnum > ) ,
459
+ }
460
+
454
461
#[ derive( Clone , PartialEq , Eq , Debug ) ]
455
462
pub struct StructField {
456
463
pub id : Box < TypedIdentifierNode > ,
@@ -471,7 +478,14 @@ impl PrintTrait for StructDefNode {
471
478
let mut i = self . fields . len ( ) ;
472
479
for field in & self . fields {
473
480
i -= 1 ;
474
- field. id . print ( tabs + 1 , i == 0 , line. clone ( ) ) ;
481
+ match field {
482
+ ParsedField :: Normal ( field) => {
483
+ field. id . print ( tabs + 1 , i == 0 , line. clone ( ) ) ;
484
+ }
485
+ ParsedField :: Err ( err_node) => {
486
+ err_node. print ( tabs + 1 , i == 0 , line. clone ( ) ) ;
487
+ }
488
+ }
475
489
}
476
490
}
477
491
}
@@ -488,13 +502,20 @@ impl Node for StructDefNode {
488
502
generics. emit_highlight ( ctx) ;
489
503
}
490
504
for field in self . fields . iter ( ) {
491
- ctx. push_semantic_token ( field. id . id . range , SemanticTokenType :: PROPERTY , 0 ) ;
492
- field. id . typenode . emit_highlight ( ctx) ;
493
- if !field. has_semi {
494
- ctx. add_diag ( field. id . range . new_err ( ErrorCode :: COMPLETION ) ) ;
495
- }
496
- if let Some ( doc) = & field. id . doc {
497
- ctx. push_semantic_token ( doc. range , SemanticTokenType :: COMMENT , 0 ) ;
505
+ match field {
506
+ ParsedField :: Normal ( field) => {
507
+ ctx. push_semantic_token ( field. id . id . range , SemanticTokenType :: PROPERTY , 0 ) ;
508
+ field. id . typenode . emit_highlight ( ctx) ;
509
+ if !field. has_semi {
510
+ ctx. add_diag ( field. id . range . new_err ( ErrorCode :: COMPLETION ) ) ;
511
+ }
512
+ if let Some ( doc) = & field. id . doc {
513
+ ctx. push_semantic_token ( doc. range , SemanticTokenType :: COMMENT , 0 ) ;
514
+ }
515
+ }
516
+ ParsedField :: Err ( _) => {
517
+ // 对于错误节点,不需要进行高亮处理
518
+ }
498
519
}
499
520
}
500
521
Ok ( Default :: default ( ) )
@@ -542,17 +563,24 @@ impl StructDefNode {
542
563
) -> Result < ( ) , PLDiag > {
543
564
let pltype = ctx. get_type ( & self . id . name , self . id . range ) ?;
544
565
for f in self . fields . iter ( ) {
545
- let id = & f. id ;
546
- // 自引用检查
547
- if let TypeNodeEnum :: Basic ( b) = & * id. typenode {
548
- if let Some ( id) = & b. id {
549
- if id. namespace . is_empty ( ) {
550
- // 只有本包内类型可能自引用
551
- let v = ctx. self_ref_map . entry ( id. id . name ) . or_default ( ) ;
552
- v. insert ( ( self . id . name , self . id . range ( ) ) ) ;
553
- ctx. check_self_ref ( & id. id . name , id. range ) ?;
566
+ match f {
567
+ ParsedField :: Normal ( field) => {
568
+ let id = & field. id ;
569
+ // 自引用检查
570
+ if let TypeNodeEnum :: Basic ( b) = & * id. typenode {
571
+ if let Some ( id) = & b. id {
572
+ if id. namespace . is_empty ( ) {
573
+ // 只有本包内类型可能自引用
574
+ let v = ctx. self_ref_map . entry ( id. id . name ) . or_default ( ) ;
575
+ v. insert ( ( self . id . name , self . id . range ( ) ) ) ;
576
+ ctx. check_self_ref ( & id. id . name , id. range ) ?;
577
+ }
578
+ }
554
579
}
555
580
}
581
+ ParsedField :: Err ( e) => {
582
+ _ = e. clone ( ) . emit ( ctx, builder) ;
583
+ }
556
584
}
557
585
}
558
586
let generic_map = if let PLType :: Struct ( st) = & mut * pltype. borrow_mut ( ) {
@@ -566,32 +594,40 @@ impl StructDefNode {
566
594
let clone_map = ctx. plmod . types . clone ( ) ;
567
595
let mut is_atomic = true ;
568
596
for ( i, field) in self . fields . iter ( ) . enumerate ( ) {
569
- if !field. has_semi {
570
- ctx. add_diag ( field. id . range . new_err ( ErrorCode :: COMPLETION ) ) ;
571
- }
572
- let id = field. id . id . clone ( ) ;
573
- let f = Field {
574
- index : i as u32 + 1 ,
575
- typenode : field. id . typenode . clone ( ) ,
576
- name : id. name ,
577
- range : field. id . id . range ,
578
- modifier : field. modifier ,
579
- } ;
580
- let tpre = field
581
- . id
582
- . typenode
583
- . get_type ( ctx, builder, self . generics . is_none ( ) ) ;
584
- if tpre. is_err ( ) {
585
- continue ;
586
- }
587
- let tp = tpre. unwrap ( ) ;
588
- if !tp. borrow ( ) . is_atomic ( ) {
589
- is_atomic = false ;
597
+ match field {
598
+ ParsedField :: Normal ( field) => {
599
+ if !field. has_semi {
600
+ ctx. add_diag ( field. id . range . new_err ( ErrorCode :: COMPLETION ) ) ;
601
+ }
602
+ let id = field. id . id . clone ( ) ;
603
+ let f = Field {
604
+ index : i as u32 + 1 ,
605
+ typenode : field. id . typenode . clone ( ) ,
606
+ name : id. name ,
607
+ range : field. id . id . range ,
608
+ modifier : field. modifier ,
609
+ } ;
610
+ let tpre =
611
+ field
612
+ . id
613
+ . typenode
614
+ . get_type ( ctx, builder, self . generics . is_none ( ) ) ;
615
+ if tpre. is_err ( ) {
616
+ continue ;
617
+ }
618
+ let tp = tpre. unwrap ( ) ;
619
+ if !tp. borrow ( ) . is_atomic ( ) {
620
+ is_atomic = false ;
621
+ }
622
+ field_pltps. push ( tp. clone ( ) ) ;
623
+ ctx. set_field_refs ( pltype. typ . clone ( ) , & f, f. range ) ;
624
+ ctx. send_if_go_to_def ( f. range , f. range , ctx. plmod . path ) ;
625
+ fields. insert ( id. name . to_string ( ) . into ( ) , f. clone ( ) ) ;
626
+ }
627
+ ParsedField :: Err ( _) => {
628
+ // 对于错误节点,跳过字段处理
629
+ }
590
630
}
591
- field_pltps. push ( tp. clone ( ) ) ;
592
- ctx. set_field_refs ( pltype. typ . clone ( ) , & f, f. range ) ;
593
- ctx. send_if_go_to_def ( f. range , f. range , ctx. plmod . path ) ;
594
- fields. insert ( id. name . to_string ( ) . into ( ) , f. clone ( ) ) ;
595
631
}
596
632
ctx. plmod . types = clone_map;
597
633
if let PLType :: Struct ( st) = & mut * pltype. borrow_mut ( ) {
0 commit comments