88// option. This file may not be copied, modified, or distributed
99// except according to those terms.
1010
11- use bridge:: { server, TokenTree } ;
12- use { Delimiter , Level , LineColumn , Spacing } ;
11+ use errors:: { self , Diagnostic , DiagnosticBuilder } ;
12+ use std:: panic;
13+
14+ use proc_macro:: bridge:: { server, TokenTree } ;
15+ use proc_macro:: { Delimiter , Level , LineColumn , Spacing } ;
1316
1417use rustc_data_structures:: sync:: Lrc ;
15- use rustc_errors:: { self as errors, Diagnostic , DiagnosticBuilder } ;
1618use std:: ascii;
1719use std:: ops:: Bound ;
1820use syntax:: ast;
@@ -24,7 +26,15 @@ use syntax_pos::hygiene::{SyntaxContext, Transparency};
2426use syntax_pos:: symbol:: { keywords, Symbol } ;
2527use syntax_pos:: { BytePos , FileName , MultiSpan , Pos , SourceFile , Span } ;
2628
27- impl Delimiter {
29+ trait FromInternal < T > {
30+ fn from_internal ( x : T ) -> Self ;
31+ }
32+
33+ trait ToInternal < T > {
34+ fn to_internal ( self ) -> T ;
35+ }
36+
37+ impl FromInternal < token:: DelimToken > for Delimiter {
2838 fn from_internal ( delim : token:: DelimToken ) -> Delimiter {
2939 match delim {
3040 token:: Paren => Delimiter :: Parenthesis ,
@@ -33,7 +43,9 @@ impl Delimiter {
3343 token:: NoDelim => Delimiter :: None ,
3444 }
3545 }
46+ }
3647
48+ impl ToInternal < token:: DelimToken > for Delimiter {
3749 fn to_internal ( self ) -> token:: DelimToken {
3850 match self {
3951 Delimiter :: Parenthesis => token:: Paren ,
@@ -44,8 +56,10 @@ impl Delimiter {
4456 }
4557}
4658
47- impl TokenTree < Group , Punct , Ident , Literal > {
48- fn from_internal ( stream : TokenStream , sess : & ParseSess , stack : & mut Vec < Self > ) -> Self {
59+ impl FromInternal < ( TokenStream , & ' _ ParseSess , & ' _ mut Vec < Self > ) >
60+ for TokenTree < Group , Punct , Ident , Literal >
61+ {
62+ fn from_internal ( ( stream, sess, stack) : ( TokenStream , & ParseSess , & mut Vec < Self > ) ) -> Self {
4963 use syntax:: parse:: token:: * ;
5064
5165 let ( tree, joint) = stream. as_tree ( ) ;
@@ -204,7 +218,9 @@ impl TokenTree<Group, Punct, Ident, Literal> {
204218 Whitespace | Comment | Shebang ( ..) | Eof => unreachable ! ( ) ,
205219 }
206220 }
221+ }
207222
223+ impl ToInternal < TokenStream > for TokenTree < Group , Punct , Ident , Literal > {
208224 fn to_internal ( self ) -> TokenStream {
209225 use syntax:: parse:: token:: * ;
210226
@@ -292,13 +308,14 @@ impl TokenTree<Group, Punct, Ident, Literal> {
292308 }
293309}
294310
295- impl Level {
311+ impl ToInternal < errors :: Level > for Level {
296312 fn to_internal ( self ) -> errors:: Level {
297313 match self {
298314 Level :: Error => errors:: Level :: Error ,
299315 Level :: Warning => errors:: Level :: Warning ,
300316 Level :: Note => errors:: Level :: Note ,
301317 Level :: Help => errors:: Level :: Help ,
318+ _ => unreachable ! ( "unknown proc_macro::Level variant: {:?}" , self ) ,
302319 }
303320 }
304321}
@@ -339,7 +356,7 @@ pub struct Literal {
339356 span : Span ,
340357}
341358
342- pub struct Rustc < ' a > {
359+ pub ( crate ) struct Rustc < ' a > {
343360 sess : & ' a ParseSess ,
344361 def_site : Span ,
345362 call_site : Span ,
@@ -429,7 +446,7 @@ impl server::TokenStreamIter for Rustc<'_> {
429446 loop {
430447 let tree = iter. stack . pop ( ) . or_else ( || {
431448 let next = iter. cursor . next_as_stream ( ) ?;
432- Some ( TokenTree :: from_internal ( next, self . sess , & mut iter. stack ) )
449+ Some ( TokenTree :: from_internal ( ( next, self . sess , & mut iter. stack ) ) )
433450 } ) ?;
434451 // HACK: The condition "dummy span + group with empty delimiter" represents an AST
435452 // fragment approximately converted into a token stream. This may happen, for
0 commit comments