9
9
use syntax:: { ast, AstNode , SyntaxNode } ;
10
10
11
11
pub ( crate ) fn ty ( s : & str ) -> Result < SyntaxNode , ( ) > {
12
- let template = "type T = {};" ;
13
- let input = template. replace ( "{}" , s) ;
14
- let parse = syntax:: SourceFile :: parse ( & input) ;
15
- if !parse. errors ( ) . is_empty ( ) {
16
- return Err ( ( ) ) ;
17
- }
18
- let node = parse. tree ( ) . syntax ( ) . descendants ( ) . find_map ( ast:: Type :: cast) . ok_or ( ( ) ) ?;
19
- if node. to_string ( ) != s {
20
- return Err ( ( ) ) ;
21
- }
22
- Ok ( node. syntax ( ) . clone_subtree ( ) )
12
+ fragment :: < ast:: Type > ( "type T = {};" , s)
23
13
}
24
14
25
15
pub ( crate ) fn item ( s : & str ) -> Result < SyntaxNode , ( ) > {
26
- let template = "{}" ;
27
- let input = template. replace ( "{}" , s) ;
28
- let parse = syntax:: SourceFile :: parse ( & input) ;
29
- if !parse. errors ( ) . is_empty ( ) {
30
- return Err ( ( ) ) ;
31
- }
32
- let node = parse. tree ( ) . syntax ( ) . descendants ( ) . find_map ( ast:: Item :: cast) . ok_or ( ( ) ) ?;
33
- if node. to_string ( ) != s {
34
- return Err ( ( ) ) ;
35
- }
36
- Ok ( node. syntax ( ) . clone_subtree ( ) )
16
+ fragment :: < ast:: Item > ( "{}" , s)
37
17
}
38
18
39
19
pub ( crate ) fn pat ( s : & str ) -> Result < SyntaxNode , ( ) > {
40
- let template = "const _: () = {let {} = ();};" ;
41
- let input = template. replace ( "{}" , s) ;
42
- let parse = syntax:: SourceFile :: parse ( & input) ;
43
- if !parse. errors ( ) . is_empty ( ) {
44
- return Err ( ( ) ) ;
45
- }
46
- let node = parse. tree ( ) . syntax ( ) . descendants ( ) . find_map ( ast:: Pat :: cast) . ok_or ( ( ) ) ?;
47
- if node. to_string ( ) != s {
48
- return Err ( ( ) ) ;
49
- }
50
- Ok ( node. syntax ( ) . clone_subtree ( ) )
20
+ fragment :: < ast:: Pat > ( "const _: () = {let {} = ();};" , s)
51
21
}
52
22
53
23
pub ( crate ) fn expr ( s : & str ) -> Result < SyntaxNode , ( ) > {
54
- let template = "const _: () = {};" ;
55
- let input = template. replace ( "{}" , s) ;
56
- let parse = syntax:: SourceFile :: parse ( & input) ;
57
- if !parse. errors ( ) . is_empty ( ) {
58
- return Err ( ( ) ) ;
59
- }
60
- let node = parse. tree ( ) . syntax ( ) . descendants ( ) . find_map ( ast:: Expr :: cast) . ok_or ( ( ) ) ?;
61
- if node. to_string ( ) != s {
62
- return Err ( ( ) ) ;
63
- }
64
- Ok ( node. syntax ( ) . clone_subtree ( ) )
24
+ fragment :: < ast:: Expr > ( "const _: () = {};" , s)
65
25
}
66
26
67
27
pub ( crate ) fn stmt ( s : & str ) -> Result < SyntaxNode , ( ) > {
@@ -82,3 +42,17 @@ pub(crate) fn stmt(s: &str) -> Result<SyntaxNode, ()> {
82
42
}
83
43
Ok ( node. syntax ( ) . clone_subtree ( ) )
84
44
}
45
+
46
+ fn fragment < T : AstNode > ( template : & str , s : & str ) -> Result < SyntaxNode , ( ) > {
47
+ let s = s. trim ( ) ;
48
+ let input = template. replace ( "{}" , s) ;
49
+ let parse = syntax:: SourceFile :: parse ( & input) ;
50
+ if !parse. errors ( ) . is_empty ( ) {
51
+ return Err ( ( ) ) ;
52
+ }
53
+ let node = parse. tree ( ) . syntax ( ) . descendants ( ) . find_map ( T :: cast) . ok_or ( ( ) ) ?;
54
+ if node. syntax ( ) . text ( ) != s {
55
+ return Err ( ( ) ) ;
56
+ }
57
+ Ok ( node. syntax ( ) . clone_subtree ( ) )
58
+ }
0 commit comments