1
1
#![ feature( proc_macro_span) ]
2
- #![ feature( proc_macro_diagnostic) ]
3
2
4
3
extern crate proc_macro;
5
4
@@ -14,7 +13,7 @@ mod embed_python;
14
13
mod error;
15
14
mod run;
16
15
17
- fn python_impl ( input : TokenStream ) -> Result < TokenStream , ( ) > {
16
+ fn python_impl ( input : TokenStream ) -> Result < TokenStream , TokenStream > {
18
17
let tokens = input. clone ( ) ;
19
18
20
19
check_no_attribute ( input. clone ( ) ) ?;
@@ -35,11 +34,11 @@ fn python_impl(input: TokenStream) -> Result<TokenStream, ()> {
35
34
let py = gil. python ( ) ;
36
35
37
36
let code = PyObject :: from_owned_ptr_or_err ( py, ffi:: Py_CompileString ( python. as_ptr ( ) , filename. as_ptr ( ) , ffi:: Py_file_input ) )
38
- . map_err ( |err| error:: emit_compile_error_msg ( py, err, tokens) ) ?;
37
+ . map_err ( |err| error:: compile_error_msg ( py, err, tokens) ) ?;
39
38
40
39
Literal :: byte_string (
41
40
PyBytes :: from_owned_ptr_or_err ( py, ffi:: PyMarshal_WriteObjectToString ( code. as_ptr ( ) , pyo3:: marshal:: VERSION ) )
42
- . map_err ( |_e| Span :: call_site ( ) . unwrap ( ) . error ( "failed to generate python bytecode" ) . emit ( ) ) ?
41
+ . map_err ( |_e| quote ! ( compile_error! { "failed to generate python bytecode" } ) ) ?
43
42
. as_bytes ( ) ,
44
43
)
45
44
} ;
@@ -61,7 +60,7 @@ fn python_impl(input: TokenStream) -> Result<TokenStream, ()> {
61
60
} )
62
61
}
63
62
64
- fn ct_python_impl ( input : TokenStream ) -> Result < TokenStream , ( ) > {
63
+ fn ct_python_impl ( input : TokenStream ) -> Result < TokenStream , TokenStream > {
65
64
let tokens = input. clone ( ) ;
66
65
67
66
let filename = Span :: call_site ( ) . unwrap ( ) . source_file ( ) . path ( ) . to_string_lossy ( ) . into_owned ( ) ;
@@ -82,28 +81,23 @@ fn ct_python_impl(input: TokenStream) -> Result<TokenStream, ()> {
82
81
83
82
let code = unsafe {
84
83
PyObject :: from_owned_ptr_or_err ( py, ffi:: Py_CompileString ( python. as_ptr ( ) , filename. as_ptr ( ) , ffi:: Py_file_input ) )
85
- . map_err ( |err| error:: emit_compile_error_msg ( py, err, tokens. clone ( ) ) ) ?
84
+ . map_err ( |err| error:: compile_error_msg ( py, err, tokens. clone ( ) ) ) ?
86
85
} ;
87
86
88
87
run:: run_ct_python ( py, code, tokens)
89
88
}
90
89
91
- fn check_no_attribute ( input : TokenStream ) -> Result < ( ) , ( ) > {
90
+ fn check_no_attribute ( input : TokenStream ) -> Result < ( ) , TokenStream > {
92
91
let mut input = input. into_iter ( ) ;
93
92
if let Some ( token) = input. next ( ) {
94
93
if token. to_string ( ) == "#"
95
94
&& input. next ( ) . map_or ( false , |t| t. to_string ( ) == "!" )
96
95
&& input. next ( ) . map_or ( false , |t| t. to_string ( ) . starts_with ( '[' ) )
97
96
{
98
- token
99
- . span ( )
100
- . unwrap ( )
101
- . error (
102
- "Attributes in python!{} are no longer supported. \
103
- Use context.run(python!{..}) to use a context.",
104
- )
105
- . emit ( ) ;
106
- return Err ( ( ) ) ;
97
+ return Err ( quote ! ( compile_error!{
98
+ "Attributes in python!{} are no longer supported. \
99
+ Use context.run(python!{..}) to use a context.",
100
+ } ) ) ;
107
101
}
108
102
}
109
103
Ok ( ( ) )
@@ -113,14 +107,14 @@ fn check_no_attribute(input: TokenStream) -> Result<(), ()> {
113
107
pub fn python ( input : TokenStream1 ) -> TokenStream1 {
114
108
TokenStream1 :: from ( match python_impl ( TokenStream :: from ( input) ) {
115
109
Ok ( tokens) => tokens,
116
- Err ( ( ) ) => TokenStream :: new ( ) ,
110
+ Err ( tokens ) => tokens ,
117
111
} )
118
112
}
119
113
120
114
#[ proc_macro]
121
115
pub fn ct_python ( input : TokenStream1 ) -> TokenStream1 {
122
116
TokenStream1 :: from ( match ct_python_impl ( TokenStream :: from ( input) ) {
123
117
Ok ( tokens) => tokens,
124
- Err ( ( ) ) => quote ! ( unimplemented! ( ) ) . into ( )
118
+ Err ( tokens ) => tokens ,
125
119
} )
126
120
}
0 commit comments