@@ -4,25 +4,21 @@ use formality_core::parse::{ActiveVariant, CoreParse, ParseError, ParseResult, P
4
4
use formality_core:: Upcast ;
5
5
use formality_core:: { seq, Set } ;
6
6
7
- use crate :: grammar:: { AdtId , AssociatedItemId , Bool , Const , RigidName , Scalar , TraitId } ;
7
+ use crate :: grammar:: { AdtId , AssociatedItemId , Bool , Const , RefKind , RigidName , Scalar , TraitId } ;
8
8
9
- use super :: { AliasTy , AssociatedTyName , Lt , LtData , Parameter , PredicateTy , RigidTy , ScalarId , Ty } ;
9
+ use super :: {
10
+ AliasTy , AssociatedTyName , Lt , LtData , Parameter , PredicateTy , RigidTy , ScalarId , Ty , TyData ,
11
+ } ;
10
12
11
13
use crate :: rust:: FormalityLang as Rust ;
12
14
13
15
// ANCHOR: ty_parse_impl
14
16
// For types, we invest some effort into parsing them decently because it makes
15
17
// writing tests so much more pleasant.
16
- impl CoreParse < Rust > for Ty {
18
+ impl CoreParse < Rust > for TyData {
17
19
fn parse < ' t > ( scope : & Scope < Rust > , text0 : & ' t str ) -> ParseResult < ' t , Self > {
18
20
let mut parser = Parser :: new ( scope, text0, "Ty" ) ;
19
- parser. parse_variant_cast :: < ScalarId > ( 1 ) ;
20
21
parser. parse_variant ( "Variable" , 1 , |p| p. variable ( ) ) ;
21
- parser. parse_variant ( "Adt" , 0 , |p| p. nonterminal_with ( parse_adt_ty) ) ;
22
- parser. parse_variant ( "Assoc" , 0 , |p| p. nonterminal_with ( parse_assoc_ty) ) ;
23
- parser. parse_variant ( "Ref" , 0 , |p| p. nonterminal_with ( parse_ref_ty) ) ;
24
- parser. parse_variant ( "RefMut" , 0 , |p| p. nonterminal_with ( parse_ref_mut_ty) ) ;
25
- parser. parse_variant ( "Tuple" , 0 , |p| p. nonterminal_with ( parse_tuple_ty) ) ;
26
22
parser. parse_variant_cast :: < RigidTy > ( 0 ) ;
27
23
parser. parse_variant_cast :: < AliasTy > ( 0 ) ;
28
24
parser. parse_variant_cast :: < PredicateTy > ( 0 ) ;
@@ -31,84 +27,87 @@ impl CoreParse<Rust> for Ty {
31
27
}
32
28
// ANCHOR_END: ty_parse_impl
33
29
34
- #[ tracing:: instrument( level = "trace" , ret) ]
35
- fn parse_adt_ty < ' t > ( scope : & Scope < Rust > , text : & ' t str ) -> ParseResult < ' t , Ty > {
36
- // Treat plain identifiers as adt ids, with or without parameters.
37
- Parser :: single_variant ( scope, text, "AdtTy" , |p| {
38
- let name: AdtId = p. nonterminal ( ) ?;
39
- let parameters: Vec < Parameter > = parse_parameters ( p) ?;
40
- Ok ( Ty :: rigid ( name, parameters) )
41
- } )
42
- }
30
+ impl CoreParse < Rust > for RigidTy {
31
+ fn parse < ' t > ( scope : & Scope < Rust > , text : & ' t str ) -> ParseResult < ' t , Self > {
32
+ let mut parser: Parser < ' _ , ' _ , RigidTy , Rust > = Parser :: new ( scope, text, "AliasTy" ) ;
43
33
44
- #[ tracing:: instrument( level = "trace" , ret) ]
45
- fn parse_ref_ty < ' t > ( scope : & Scope < Rust > , text : & ' t str ) -> ParseResult < ' t , Ty > {
46
- Parser :: single_variant ( scope, text, "RefTy" , |p| {
47
- p. expect_char ( '&' ) ?;
48
- let lt: Lt = p. nonterminal ( ) ?;
49
- let ty: Ty = p. nonterminal ( ) ?;
50
- let name = crate :: grammar:: RigidName :: Ref ( crate :: grammar:: RefKind :: Shared ) ;
51
- Ok ( RigidTy {
52
- name,
53
- parameters : seq ! [ lt. upcast( ) , ty. upcast( ) ] ,
54
- }
55
- . upcast ( ) )
56
- } )
57
- }
34
+ parser. parse_variant_cast :: < ScalarId > ( 1 ) ;
58
35
59
- #[ tracing:: instrument( level = "trace" , ret) ]
60
- fn parse_ref_mut_ty < ' t > ( scope : & Scope < Rust > , text : & ' t str ) -> ParseResult < ' t , Ty > {
61
- Parser :: single_variant ( scope, text, "RefMutTy" , |p| {
62
- p. expect_char ( '&' ) ?;
63
- p. expect_keyword ( "mut" ) ?;
64
- let lt: Lt = p. nonterminal ( ) ?;
65
- let ty: Ty = p. nonterminal ( ) ?;
66
- let name = crate :: grammar:: RigidName :: Ref ( crate :: grammar:: RefKind :: Mut ) ;
67
- Ok ( RigidTy {
68
- name,
69
- parameters : seq ! [ lt. upcast( ) , ty. upcast( ) ] ,
70
- }
71
- . upcast ( ) )
72
- } )
73
- }
36
+ parser. parse_variant ( "Adt" , 0 , |p| {
37
+ let name: AdtId = p. nonterminal ( ) ?;
38
+ let parameters: Vec < Parameter > = parse_parameters ( p) ?;
39
+ Ok ( RigidTy {
40
+ name : name. upcast ( ) ,
41
+ parameters,
42
+ } )
43
+ } ) ;
74
44
75
- #[ tracing:: instrument( level = "trace" , ret) ]
76
- fn parse_tuple_ty < ' t > ( scope : & Scope < Rust > , text : & ' t str ) -> ParseResult < ' t , Ty > {
77
- Parser :: single_variant ( scope, text, "TupleTy" , |p| {
78
- p. expect_char ( '(' ) ?;
79
- p. reject_custom_keywords ( & [ "alias" , "rigid" , "predicate" ] ) ?;
80
- let types: Vec < Ty > = p. comma_nonterminal ( ) ?;
81
- p. expect_char ( ')' ) ?;
82
- let name = RigidName :: Tuple ( types. len ( ) ) ;
83
- Ok ( RigidTy {
84
- name,
85
- parameters : types. upcast ( ) ,
86
- }
87
- . upcast ( ) )
88
- } )
45
+ parser. parse_variant ( "Ref" , 0 , |p| {
46
+ p. expect_char ( '&' ) ?;
47
+ let lt: Lt = p. nonterminal ( ) ?;
48
+ let ty: Ty = p. nonterminal ( ) ?;
49
+ Ok ( RigidTy {
50
+ name : RigidName :: Ref ( RefKind :: Shared ) ,
51
+ parameters : seq ! [ lt. upcast( ) , ty. upcast( ) ] ,
52
+ }
53
+ . upcast ( ) )
54
+ } ) ;
55
+
56
+ parser. parse_variant ( "RefMut" , 0 , |p| {
57
+ p. expect_char ( '&' ) ?;
58
+ p. expect_keyword ( "mut" ) ?;
59
+ let lt: Lt = p. nonterminal ( ) ?;
60
+ let ty: Ty = p. nonterminal ( ) ?;
61
+ Ok ( RigidTy {
62
+ name : RigidName :: Ref ( RefKind :: Mut ) ,
63
+ parameters : seq ! [ lt. upcast( ) , ty. upcast( ) ] ,
64
+ } )
65
+ } ) ;
66
+
67
+ parser. parse_variant ( "Tuple" , 0 , |p| {
68
+ p. expect_char ( '(' ) ?;
69
+ p. reject_custom_keywords ( & [ "alias" , "rigid" , "predicate" ] ) ?;
70
+ let types: Vec < Ty > = p. comma_nonterminal ( ) ?;
71
+ p. expect_char ( ')' ) ?;
72
+ let name = RigidName :: Tuple ( types. len ( ) ) ;
73
+ Ok ( RigidTy {
74
+ name,
75
+ parameters : types. upcast ( ) ,
76
+ } )
77
+ } ) ;
78
+
79
+ parser. finish ( )
80
+ }
89
81
}
90
82
91
- #[ tracing:: instrument( level = "trace" , ret) ]
92
- fn parse_assoc_ty < ' t > ( scope : & Scope < Rust > , text : & ' t str ) -> ParseResult < ' t , Ty > {
93
- Parser :: single_variant ( scope, text, "AssocTy" , |p| {
94
- p. expect_char ( '<' ) ?;
95
- let ty0: Ty = p. nonterminal ( ) ?;
96
- let ( ) = p. expect_keyword ( "as" ) ?;
97
- let trait_id: TraitId = p. nonterminal ( ) ?;
98
- let trait_parameters1 = parse_parameters ( p) ?;
99
- p. expect_char ( '>' ) ?;
100
- p. expect_char ( ':' ) ?;
101
- p. expect_char ( ':' ) ?;
102
- let item_id: AssociatedItemId = p. nonterminal ( ) ?;
103
- let item_parameters = parse_parameters ( p) ?;
104
- let assoc_ty_id = AssociatedTyName { trait_id, item_id } ;
105
- let parameters: Vec < Parameter > = std:: iter:: once ( ty0. upcast ( ) )
106
- . chain ( trait_parameters1)
107
- . chain ( item_parameters)
108
- . collect ( ) ;
109
- Ok ( Ty :: alias ( assoc_ty_id, parameters) )
110
- } )
111
- // Treat plain identifiers as adt ids, with or without parameters.
83
+ impl CoreParse < Rust > for AliasTy {
84
+ fn parse < ' t > ( scope : & Scope < Rust > , text : & ' t str ) -> ParseResult < ' t , Self > {
85
+ let mut parser: Parser < ' _ , ' _ , AliasTy , Rust > = Parser :: new ( scope, text, "AliasTy" ) ;
86
+
87
+ parser. parse_variant ( "associated type" , 0 , |p| {
88
+ p. expect_char ( '<' ) ?;
89
+ let ty0: Ty = p. nonterminal ( ) ?;
90
+ let ( ) = p. expect_keyword ( "as" ) ?;
91
+ let trait_id: TraitId = p. nonterminal ( ) ?;
92
+ let trait_parameters1 = parse_parameters ( p) ?;
93
+ p. expect_char ( '>' ) ?;
94
+ p. expect_char ( ':' ) ?;
95
+ p. expect_char ( ':' ) ?;
96
+ let item_id: AssociatedItemId = p. nonterminal ( ) ?;
97
+ let item_parameters = parse_parameters ( p) ?;
98
+ let name = AssociatedTyName { trait_id, item_id } ;
99
+ let parameters: Vec < Parameter > = std:: iter:: once ( ty0. upcast ( ) )
100
+ . chain ( trait_parameters1)
101
+ . chain ( item_parameters)
102
+ . collect ( ) ;
103
+ Ok ( AliasTy {
104
+ name : name. upcast ( ) ,
105
+ parameters,
106
+ } )
107
+ } ) ;
108
+
109
+ parser. finish ( )
110
+ }
112
111
}
113
112
114
113
fn parse_parameters < ' t > (
0 commit comments