@@ -338,7 +338,7 @@ fn parse_super_class(lexer: &mut ParseSession) -> Option<String> {
338
338
fn parse_return_type ( lexer : & mut ParseSession , pou_type : & PouType ) -> Option < DataTypeDeclaration > {
339
339
let start_return_type = lexer. range ( ) . start ;
340
340
if lexer. try_consume ( & KeywordColon ) {
341
- if let Some ( ( declaration, initializer) ) = parse_data_type_definition ( lexer, None ) {
341
+ if let Some ( ( declaration, initializer) ) = parse_datatype_with_initializer ( lexer, None ) {
342
342
if let Some ( init) = initializer {
343
343
lexer. accept_diagnostic ( Diagnostic :: unexpected_initializer_on_function_return (
344
344
init. get_location ( ) ,
@@ -587,7 +587,7 @@ fn parse_full_data_type_definition(
587
587
None ,
588
588
) )
589
589
} else {
590
- parse_data_type_definition ( lexer, name) . map ( |( type_def, initializer) | {
590
+ parse_datatype_with_initializer ( lexer, name) . map ( |( type_def, initializer) | {
591
591
if lexer. try_consume ( & KeywordDotDotDot ) {
592
592
(
593
593
DataTypeDeclaration :: DataTypeDefinition {
@@ -605,23 +605,29 @@ fn parse_full_data_type_definition(
605
605
} )
606
606
}
607
607
608
- // TYPE xxx : 'STRUCT' | '(' | IDENTIFIER
609
- fn parse_data_type_definition (
608
+ fn parse_datatype_with_initializer (
610
609
lexer : & mut ParseSession ,
611
610
name : Option < String > ,
612
611
) -> Option < DataTypeWithInitializer > {
612
+ parse_data_type_definition ( lexer, name) . map ( |type_def| {
613
+ let initializer =
614
+ if lexer. try_consume ( & KeywordAssignment ) { Some ( parse_expression ( lexer) ) } else { None } ;
615
+
616
+ ( type_def, initializer)
617
+ } )
618
+ }
619
+
620
+ // TYPE xxx : 'STRUCT' | '(' | IDENTIFIER
621
+ fn parse_data_type_definition ( lexer : & mut ParseSession , name : Option < String > ) -> Option < DataTypeDeclaration > {
613
622
let start = lexer. location ( ) ;
614
623
if lexer. try_consume ( & KeywordStruct ) {
615
624
// Parse struct
616
625
let variables = parse_variable_list ( lexer) ;
617
- Some ( (
618
- DataTypeDeclaration :: DataTypeDefinition {
619
- data_type : DataType :: StructType { name, variables } ,
620
- location : start. span ( & lexer. location ( ) ) ,
621
- scope : lexer. scope . clone ( ) ,
622
- } ,
623
- None ,
624
- ) )
626
+ Some ( DataTypeDeclaration :: DataTypeDefinition {
627
+ data_type : DataType :: StructType { name, variables } ,
628
+ location : start. span ( & lexer. location ( ) ) ,
629
+ scope : lexer. scope . clone ( ) ,
630
+ } )
625
631
} else if lexer. try_consume ( & KeywordArray ) {
626
632
parse_array_type_definition ( lexer, name)
627
633
} else if lexer. try_consume ( & KeywordPointer ) {
@@ -661,23 +667,18 @@ fn parse_pointer_definition(
661
667
lexer : & mut ParseSession ,
662
668
name : Option < String > ,
663
669
start_pos : usize ,
664
- ) -> Option < ( DataTypeDeclaration , Option < AstNode > ) > {
665
- parse_data_type_definition ( lexer, None ) . map ( |( decl, initializer) | {
666
- (
667
- DataTypeDeclaration :: DataTypeDefinition {
668
- data_type : DataType :: PointerType { name, referenced_type : Box :: new ( decl) } ,
669
- location : lexer. source_range_factory . create_range ( start_pos..lexer. last_range . end ) ,
670
- scope : lexer. scope . clone ( ) ,
671
- } ,
672
- initializer,
673
- )
670
+ ) -> Option < DataTypeDeclaration > {
671
+ parse_data_type_definition ( lexer, None ) . map ( |decl| DataTypeDeclaration :: DataTypeDefinition {
672
+ data_type : DataType :: PointerType { name, referenced_type : Box :: new ( decl) } ,
673
+ location : lexer. source_range_factory . create_range ( start_pos..lexer. last_range . end ) ,
674
+ scope : lexer. scope . clone ( ) ,
674
675
} )
675
676
}
676
677
677
678
fn parse_type_reference_type_definition (
678
679
lexer : & mut ParseSession ,
679
680
name : Option < String > ,
680
- ) -> Option < ( DataTypeDeclaration , Option < AstNode > ) > {
681
+ ) -> Option < DataTypeDeclaration > {
681
682
let start = lexer. range ( ) . start ;
682
683
//Subrange
683
684
let referenced_type = lexer. slice_and_advance ( ) ;
@@ -692,9 +693,6 @@ fn parse_type_reference_type_definition(
692
693
None
693
694
} ;
694
695
695
- let initial_value =
696
- if lexer. try_consume ( & KeywordAssignment ) { Some ( parse_expression ( lexer) ) } else { None } ;
697
-
698
696
let end = lexer. last_range . end ;
699
697
if name. is_some ( ) || bounds. is_some ( ) {
700
698
let data_type = match bounds {
@@ -732,15 +730,12 @@ fn parse_type_reference_type_definition(
732
730
scope : lexer. scope . clone ( ) ,
733
731
} ,
734
732
} ;
735
- Some ( ( data_type, initial_value ) )
733
+ Some ( data_type)
736
734
} else {
737
- Some ( (
738
- DataTypeDeclaration :: DataTypeReference {
739
- referenced_type,
740
- location : lexer. source_range_factory . create_range ( start..end) ,
741
- } ,
742
- initial_value,
743
- ) )
735
+ Some ( DataTypeDeclaration :: DataTypeReference {
736
+ referenced_type,
737
+ location : lexer. source_range_factory . create_range ( start..end) ,
738
+ } )
744
739
}
745
740
}
746
741
@@ -778,7 +773,7 @@ fn parse_string_size_expression(lexer: &mut ParseSession) -> Option<AstNode> {
778
773
fn parse_string_type_definition (
779
774
lexer : & mut ParseSession ,
780
775
name : Option < String > ,
781
- ) -> Option < ( DataTypeDeclaration , Option < AstNode > ) > {
776
+ ) -> Option < DataTypeDeclaration > {
782
777
let text = lexer. slice ( ) . to_string ( ) ;
783
778
let start = lexer. range ( ) . start ;
784
779
let is_wide = lexer. token == KeywordWideString ;
@@ -805,34 +800,26 @@ fn parse_string_type_definition(
805
800
} ) ,
806
801
_ => Some ( DataTypeDeclaration :: DataTypeReference { referenced_type : text, location } ) ,
807
802
}
808
- . zip ( Some ( lexer. try_consume ( & KeywordAssignment ) . then ( || parse_expression ( lexer) ) ) )
809
803
}
810
804
811
- fn parse_enum_type_definition (
812
- lexer : & mut ParseSession ,
813
- name : Option < String > ,
814
- ) -> Option < ( DataTypeDeclaration , Option < AstNode > ) > {
805
+ fn parse_enum_type_definition ( lexer : & mut ParseSession , name : Option < String > ) -> Option < DataTypeDeclaration > {
815
806
let start = lexer. last_location ( ) ;
816
807
let elements = parse_any_in_region ( lexer, vec ! [ KeywordParensClose ] , |lexer| {
817
808
// Parse Enum - we expect at least one element
818
809
let elements = parse_expression_list ( lexer) ;
819
810
Some ( elements)
820
811
} ) ?;
821
- let initializer = lexer. try_consume ( & KeywordAssignment ) . then ( || parse_expression ( lexer) ) ;
822
- Some ( (
823
- DataTypeDeclaration :: DataTypeDefinition {
824
- data_type : DataType :: EnumType { name, elements, numeric_type : DINT_TYPE . to_string ( ) } ,
825
- location : start. span ( & lexer. last_location ( ) ) ,
826
- scope : lexer. scope . clone ( ) ,
827
- } ,
828
- initializer,
829
- ) )
812
+ Some ( DataTypeDeclaration :: DataTypeDefinition {
813
+ data_type : DataType :: EnumType { name, elements, numeric_type : DINT_TYPE . to_string ( ) } ,
814
+ location : start. span ( & lexer. last_location ( ) ) ,
815
+ scope : lexer. scope . clone ( ) ,
816
+ } )
830
817
}
831
818
832
819
fn parse_array_type_definition (
833
820
lexer : & mut ParseSession ,
834
821
name : Option < String > ,
835
- ) -> Option < ( DataTypeDeclaration , Option < AstNode > ) > {
822
+ ) -> Option < DataTypeDeclaration > {
836
823
let start = lexer. last_range . start ;
837
824
let range = parse_any_in_region ( lexer, vec ! [ KeywordOf ] , |lexer| {
838
825
// Parse Array range
@@ -849,7 +836,7 @@ fn parse_array_type_definition(
849
836
} ) ?;
850
837
851
838
let inner_type_defintion = parse_data_type_definition ( lexer, None ) ;
852
- inner_type_defintion. map ( |( reference, initializer ) | {
839
+ inner_type_defintion. map ( |reference| {
853
840
let reference_end = reference. get_location ( ) . to_range ( ) . map ( |it| it. end ) . unwrap_or ( 0 ) ;
854
841
let location = lexer. source_range_factory . create_range ( start..reference_end) ;
855
842
@@ -876,19 +863,16 @@ fn parse_array_type_definition(
876
863
}
877
864
} ;
878
865
879
- (
880
- DataTypeDeclaration :: DataTypeDefinition {
881
- data_type : DataType :: ArrayType {
882
- name,
883
- bounds : range,
884
- referenced_type : Box :: new ( reference) ,
885
- is_variable_length,
886
- } ,
887
- location,
888
- scope : lexer. scope . clone ( ) ,
866
+ DataTypeDeclaration :: DataTypeDefinition {
867
+ data_type : DataType :: ArrayType {
868
+ name,
869
+ bounds : range,
870
+ referenced_type : Box :: new ( reference) ,
871
+ is_variable_length,
889
872
} ,
890
- initializer,
891
- )
873
+ location,
874
+ scope : lexer. scope . clone ( ) ,
875
+ }
892
876
} )
893
877
}
894
878
0 commit comments