@@ -28,10 +28,10 @@ use std::thread;
28
28
/// // ...
29
29
/// Literal {
30
30
/// // ...
31
- /// fn character(ch: char) -> MySelf::Literal;
31
+ /// wait fn character(ch: char) -> MySelf::Literal;
32
32
/// // ...
33
- /// fn span(my_self: &MySelf::Literal) -> MySelf::Span;
34
- /// fn set_span(my_self: &mut MySelf::Literal, span: MySelf::Span);
33
+ /// wait fn span(my_self: &MySelf::Literal) -> MySelf::Span;
34
+ /// nowait fn set_span(my_self: &mut MySelf::Literal, span: MySelf::Span);
35
35
/// },
36
36
/// // ...
37
37
/// }
@@ -49,119 +49,125 @@ use std::thread;
49
49
/// a trait or a trait impl, where the trait has associated types
50
50
/// for each of the API types. If non-associated types are desired,
51
51
/// a module name (`self` in practice) can be used instead of `Self`.
52
+ ///
53
+ /// If the `nowait` modifier is used, the server implementation may not
54
+ /// panic, and the client will continue immediately without waiting for
55
+ /// a response from the server when in multithreaded mode. If a return
56
+ /// type is present, it must be an owning IPC handle. Other return types
57
+ /// are not supported with `nowait`.
52
58
macro_rules! with_api {
53
59
( $S: ident, $self: ident, $m: ident) => {
54
60
$m! {
55
61
FreeFunctions {
56
- fn drop( $self: $S:: FreeFunctions ) ;
57
- fn track_env_var( var: & str , value: Option <& str >) ;
62
+ nowait fn drop( $self: $S:: FreeFunctions ) ;
63
+ nowait fn track_env_var( var: & str , value: Option <& str >) ;
58
64
} ,
59
65
TokenStream {
60
- fn drop( $self: $S:: TokenStream ) ;
61
- fn clone( $self: & $S:: TokenStream ) -> $S:: TokenStream ;
62
- fn new( ) -> $S:: TokenStream ;
63
- fn is_empty( $self: & $S:: TokenStream ) -> bool ;
64
- fn from_str( src: & str ) -> $S:: TokenStream ;
65
- fn to_string( $self: & $S:: TokenStream ) -> String ;
66
- fn from_token_tree(
66
+ nowait fn drop( $self: $S:: TokenStream ) ;
67
+ nowait fn clone( $self: & $S:: TokenStream ) -> $S:: TokenStream ;
68
+ nowait fn new( ) -> $S:: TokenStream ;
69
+ wait fn is_empty( $self: & $S:: TokenStream ) -> bool ;
70
+ wait fn from_str( src: & str ) -> $S:: TokenStream ;
71
+ wait fn to_string( $self: & $S:: TokenStream ) -> String ;
72
+ nowait fn from_token_tree(
67
73
tree: TokenTree <$S:: Group , $S:: Punct , $S:: Ident , $S:: Literal >,
68
74
) -> $S:: TokenStream ;
69
- fn into_iter( $self: $S:: TokenStream ) -> $S:: TokenStreamIter ;
75
+ nowait fn into_iter( $self: $S:: TokenStream ) -> $S:: TokenStreamIter ;
70
76
} ,
71
77
TokenStreamBuilder {
72
- fn drop( $self: $S:: TokenStreamBuilder ) ;
73
- fn new( ) -> $S:: TokenStreamBuilder ;
74
- fn push( $self: & mut $S:: TokenStreamBuilder , stream: $S:: TokenStream ) ;
75
- fn build( $self: $S:: TokenStreamBuilder ) -> $S:: TokenStream ;
78
+ nowait fn drop( $self: $S:: TokenStreamBuilder ) ;
79
+ nowait fn new( ) -> $S:: TokenStreamBuilder ;
80
+ nowait fn push( $self: & mut $S:: TokenStreamBuilder , stream: $S:: TokenStream ) ;
81
+ nowait fn build( $self: $S:: TokenStreamBuilder ) -> $S:: TokenStream ;
76
82
} ,
77
83
TokenStreamIter {
78
- fn drop( $self: $S:: TokenStreamIter ) ;
79
- fn clone( $self: & $S:: TokenStreamIter ) -> $S:: TokenStreamIter ;
80
- fn next(
84
+ nowait fn drop( $self: $S:: TokenStreamIter ) ;
85
+ nowait fn clone( $self: & $S:: TokenStreamIter ) -> $S:: TokenStreamIter ;
86
+ wait fn next(
81
87
$self: & mut $S:: TokenStreamIter ,
82
88
) -> Option <TokenTree <$S:: Group , $S:: Punct , $S:: Ident , $S:: Literal >>;
83
89
} ,
84
90
Group {
85
- fn drop( $self: $S:: Group ) ;
86
- fn clone( $self: & $S:: Group ) -> $S:: Group ;
87
- fn new( delimiter: Delimiter , stream: $S:: TokenStream ) -> $S:: Group ;
88
- fn delimiter( $self: & $S:: Group ) -> Delimiter ;
89
- fn stream( $self: & $S:: Group ) -> $S:: TokenStream ;
90
- fn span( $self: & $S:: Group ) -> $S:: Span ;
91
- fn span_open( $self: & $S:: Group ) -> $S:: Span ;
92
- fn span_close( $self: & $S:: Group ) -> $S:: Span ;
93
- fn set_span( $self: & mut $S:: Group , span: $S:: Span ) ;
91
+ nowait fn drop( $self: $S:: Group ) ;
92
+ nowait fn clone( $self: & $S:: Group ) -> $S:: Group ;
93
+ nowait fn new( delimiter: Delimiter , stream: $S:: TokenStream ) -> $S:: Group ;
94
+ wait fn delimiter( $self: & $S:: Group ) -> Delimiter ;
95
+ nowait fn stream( $self: & $S:: Group ) -> $S:: TokenStream ;
96
+ wait fn span( $self: & $S:: Group ) -> $S:: Span ;
97
+ wait fn span_open( $self: & $S:: Group ) -> $S:: Span ;
98
+ wait fn span_close( $self: & $S:: Group ) -> $S:: Span ;
99
+ nowait fn set_span( $self: & mut $S:: Group , span: $S:: Span ) ;
94
100
} ,
95
101
Punct {
96
- fn new( ch: char , spacing: Spacing ) -> $S:: Punct ;
97
- fn as_char( $self: $S:: Punct ) -> char ;
98
- fn spacing( $self: $S:: Punct ) -> Spacing ;
99
- fn span( $self: $S:: Punct ) -> $S:: Span ;
100
- fn with_span( $self: $S:: Punct , span: $S:: Span ) -> $S:: Punct ;
102
+ wait fn new( ch: char , spacing: Spacing ) -> $S:: Punct ;
103
+ wait fn as_char( $self: $S:: Punct ) -> char ;
104
+ wait fn spacing( $self: $S:: Punct ) -> Spacing ;
105
+ wait fn span( $self: $S:: Punct ) -> $S:: Span ;
106
+ wait fn with_span( $self: $S:: Punct , span: $S:: Span ) -> $S:: Punct ;
101
107
} ,
102
108
Ident {
103
- fn new( string: & str , span: $S:: Span , is_raw: bool ) -> $S:: Ident ;
104
- fn span( $self: $S:: Ident ) -> $S:: Span ;
105
- fn with_span( $self: $S:: Ident , span: $S:: Span ) -> $S:: Ident ;
109
+ wait fn new( string: & str , span: $S:: Span , is_raw: bool ) -> $S:: Ident ;
110
+ wait fn span( $self: $S:: Ident ) -> $S:: Span ;
111
+ wait fn with_span( $self: $S:: Ident , span: $S:: Span ) -> $S:: Ident ;
106
112
} ,
107
113
Literal {
108
- fn drop( $self: $S:: Literal ) ;
109
- fn clone( $self: & $S:: Literal ) -> $S:: Literal ;
110
- fn from_str( s: & str ) -> Result <$S:: Literal , ( ) >;
111
- fn debug_kind( $self: & $S:: Literal ) -> String ;
112
- fn symbol( $self: & $S:: Literal ) -> String ;
113
- fn suffix( $self: & $S:: Literal ) -> Option <String >;
114
- fn integer( n: & str ) -> $S:: Literal ;
115
- fn typed_integer( n: & str , kind: & str ) -> $S:: Literal ;
116
- fn float( n: & str ) -> $S:: Literal ;
117
- fn f32 ( n: & str ) -> $S:: Literal ;
118
- fn f64 ( n: & str ) -> $S:: Literal ;
119
- fn string( string: & str ) -> $S:: Literal ;
120
- fn character( ch: char ) -> $S:: Literal ;
121
- fn byte_string( bytes: & [ u8 ] ) -> $S:: Literal ;
122
- fn span( $self: & $S:: Literal ) -> $S:: Span ;
123
- fn set_span( $self: & mut $S:: Literal , span: $S:: Span ) ;
124
- fn subspan(
114
+ nowait fn drop( $self: $S:: Literal ) ;
115
+ nowait fn clone( $self: & $S:: Literal ) -> $S:: Literal ;
116
+ wait fn from_str( s: & str ) -> Result <$S:: Literal , ( ) >;
117
+ wait fn debug_kind( $self: & $S:: Literal ) -> String ;
118
+ wait fn symbol( $self: & $S:: Literal ) -> String ;
119
+ wait fn suffix( $self: & $S:: Literal ) -> Option <String >;
120
+ nowait fn integer( n: & str ) -> $S:: Literal ;
121
+ nowait fn typed_integer( n: & str , kind: & str ) -> $S:: Literal ;
122
+ nowait fn float( n: & str ) -> $S:: Literal ;
123
+ nowait fn f32 ( n: & str ) -> $S:: Literal ;
124
+ nowait fn f64 ( n: & str ) -> $S:: Literal ;
125
+ nowait fn string( string: & str ) -> $S:: Literal ;
126
+ nowait fn character( ch: char ) -> $S:: Literal ;
127
+ nowait fn byte_string( bytes: & [ u8 ] ) -> $S:: Literal ;
128
+ wait fn span( $self: & $S:: Literal ) -> $S:: Span ;
129
+ nowait fn set_span( $self: & mut $S:: Literal , span: $S:: Span ) ;
130
+ wait fn subspan(
125
131
$self: & $S:: Literal ,
126
132
start: Bound <usize >,
127
133
end: Bound <usize >,
128
134
) -> Option <$S:: Span >;
129
135
} ,
130
136
SourceFile {
131
- fn drop( $self: $S:: SourceFile ) ;
132
- fn clone( $self: & $S:: SourceFile ) -> $S:: SourceFile ;
133
- fn eq( $self: & $S:: SourceFile , other: & $S:: SourceFile ) -> bool ;
134
- fn path( $self: & $S:: SourceFile ) -> String ;
135
- fn is_real( $self: & $S:: SourceFile ) -> bool ;
137
+ nowait fn drop( $self: $S:: SourceFile ) ;
138
+ nowait fn clone( $self: & $S:: SourceFile ) -> $S:: SourceFile ;
139
+ wait fn eq( $self: & $S:: SourceFile , other: & $S:: SourceFile ) -> bool ;
140
+ wait fn path( $self: & $S:: SourceFile ) -> String ;
141
+ wait fn is_real( $self: & $S:: SourceFile ) -> bool ;
136
142
} ,
137
143
MultiSpan {
138
- fn drop( $self: $S:: MultiSpan ) ;
139
- fn new( ) -> $S:: MultiSpan ;
140
- fn push( $self: & mut $S:: MultiSpan , span: $S:: Span ) ;
144
+ nowait fn drop( $self: $S:: MultiSpan ) ;
145
+ nowait fn new( ) -> $S:: MultiSpan ;
146
+ wait fn push( $self: & mut $S:: MultiSpan , span: $S:: Span ) ;
141
147
} ,
142
148
Diagnostic {
143
- fn drop( $self: $S:: Diagnostic ) ;
144
- fn new( level: Level , msg: & str , span: $S:: MultiSpan ) -> $S:: Diagnostic ;
145
- fn sub(
149
+ wait fn drop( $self: $S:: Diagnostic ) ;
150
+ wait fn new( level: Level , msg: & str , span: $S:: MultiSpan ) -> $S:: Diagnostic ;
151
+ wait fn sub(
146
152
$self: & mut $S:: Diagnostic ,
147
153
level: Level ,
148
154
msg: & str ,
149
155
span: $S:: MultiSpan ,
150
156
) ;
151
- fn emit( $self: $S:: Diagnostic ) ;
157
+ wait fn emit( $self: $S:: Diagnostic ) ;
152
158
} ,
153
159
Span {
154
- fn debug( $self: $S:: Span ) -> String ;
155
- fn source_file( $self: $S:: Span ) -> $S:: SourceFile ;
156
- fn parent( $self: $S:: Span ) -> Option <$S:: Span >;
157
- fn source( $self: $S:: Span ) -> $S:: Span ;
158
- fn start( $self: $S:: Span ) -> LineColumn ;
159
- fn end( $self: $S:: Span ) -> LineColumn ;
160
- fn join( $self: $S:: Span , other: $S:: Span ) -> Option <$S:: Span >;
161
- fn resolved_at( $self: $S:: Span , at: $S:: Span ) -> $S:: Span ;
162
- fn source_text( $self: $S:: Span ) -> Option <String >;
163
- fn save_span( $self: $S:: Span ) -> usize ;
164
- fn recover_proc_macro_span( id: usize ) -> $S:: Span ;
160
+ wait fn debug( $self: $S:: Span ) -> String ;
161
+ wait fn source_file( $self: $S:: Span ) -> $S:: SourceFile ;
162
+ wait fn parent( $self: $S:: Span ) -> Option <$S:: Span >;
163
+ wait fn source( $self: $S:: Span ) -> $S:: Span ;
164
+ wait fn start( $self: $S:: Span ) -> LineColumn ;
165
+ wait fn end( $self: $S:: Span ) -> LineColumn ;
166
+ wait fn join( $self: $S:: Span , other: $S:: Span ) -> Option <$S:: Span >;
167
+ wait fn resolved_at( $self: $S:: Span , at: $S:: Span ) -> $S:: Span ;
168
+ wait fn source_text( $self: $S:: Span ) -> Option <String >;
169
+ wait fn save_span( $self: $S:: Span ) -> usize ;
170
+ wait fn recover_proc_macro_span( id: usize ) -> $S:: Span ;
165
171
} ,
166
172
}
167
173
} ;
@@ -232,9 +238,18 @@ impl<'a> !Send for BridgeConfig<'a> {}
232
238
mod api_tags {
233
239
use super :: rpc:: { DecodeMut , Encode , Reader , Writer } ;
234
240
241
+ macro_rules! should_wait_impl {
242
+ ( wait) => {
243
+ true
244
+ } ;
245
+ ( nowait) => {
246
+ false
247
+ } ;
248
+ }
249
+
235
250
macro_rules! declare_tags {
236
251
( $( $name: ident {
237
- $( fn $method: ident( $( $arg: ident: $arg_ty: ty) ,* $( , ) ?) $( -> $ret_ty: ty) * ; ) *
252
+ $( $wait : ident fn $method: ident( $( $arg: ident: $arg_ty: ty) ,* $( , ) ?) $( -> $ret_ty: ty) * ; ) *
238
253
} ) ,* $( , ) ?) => {
239
254
$(
240
255
pub ( super ) enum $name {
@@ -248,6 +263,16 @@ mod api_tags {
248
263
$( $name( $name) ) ,*
249
264
}
250
265
rpc_encode_decode!( enum Method { $( $name( m) ) ,* } ) ;
266
+
267
+ impl Method {
268
+ pub ( super ) fn should_wait( & self ) -> bool {
269
+ match self {
270
+ $( $(
271
+ Method :: $name( $name:: $method) => should_wait_impl!( $wait) ,
272
+ ) * ) *
273
+ }
274
+ }
275
+ }
251
276
}
252
277
}
253
278
with_api ! ( self , self , declare_tags) ;
0 commit comments