proc_macro_api/bidirectional_protocol/
msg.rs1use std::ops::Range;
4
5use paths::Utf8PathBuf;
6use serde::{Deserialize, Serialize};
7
8use crate::{
9 ProcMacroKind,
10 legacy_protocol::msg::{FlatTree, Message, PanicMessage, ServerConfig},
11};
12
13#[derive(Debug, Serialize, Deserialize)]
14pub enum SubRequest {
15 FilePath { file_id: u32 },
16 SourceText { file_id: u32, ast_id: u32, start: u32, end: u32 },
17 LocalFilePath { file_id: u32 },
18 LineColumn { file_id: u32, ast_id: u32, offset: u32 },
19 ByteRange { file_id: u32, ast_id: u32, start: u32, end: u32 },
20}
21
22#[derive(Debug, Serialize, Deserialize)]
23pub enum SubResponse {
24 FilePathResult {
25 name: String,
26 },
27 SourceTextResult {
28 text: Option<String>,
29 },
30 LocalFilePathResult {
31 name: Option<String>,
32 },
33 LineColumnResult {
35 line: u32,
36 column: u32,
37 },
38 ByteRangeResult {
39 range: Range<usize>,
40 },
41}
42
43#[derive(Debug, Serialize, Deserialize)]
44pub enum BidirectionalMessage {
45 Request(Request),
46 Response(Response),
47 SubRequest(SubRequest),
48 SubResponse(SubResponse),
49}
50
51#[derive(Debug, Serialize, Deserialize)]
52pub enum Request {
53 ListMacros { dylib_path: Utf8PathBuf },
54 ExpandMacro(Box<ExpandMacro>),
55 ApiVersionCheck {},
56 SetConfig(ServerConfig),
57}
58
59#[derive(Debug, Serialize, Deserialize)]
60pub enum Response {
61 ListMacros(Result<Vec<(String, ProcMacroKind)>, String>),
62 ExpandMacro(Result<FlatTree, PanicMessage>),
63 ApiVersionCheck(u32),
64 SetConfig(ServerConfig),
65 ExpandMacroExtended(Result<ExpandMacroExtended, PanicMessage>),
66}
67
68#[derive(Debug, Serialize, Deserialize)]
69pub struct ExpandMacro {
70 pub lib: Utf8PathBuf,
71 pub env: Vec<(String, String)>,
72 pub current_dir: Option<String>,
73 pub data: ExpandMacroData,
74}
75
76#[derive(Debug, Serialize, Deserialize)]
77pub struct ExpandMacroExtended {
78 pub tree: FlatTree,
79 pub span_data_table: Vec<u32>,
80}
81
82#[derive(Debug, Serialize, Deserialize)]
83pub struct ExpandMacroData {
84 pub macro_body: FlatTree,
85 pub macro_name: String,
86 pub attributes: Option<FlatTree>,
87 #[serde(skip_serializing_if = "ExpnGlobals::skip_serializing_if")]
88 #[serde(default)]
89 pub has_global_spans: ExpnGlobals,
90
91 #[serde(skip_serializing_if = "Vec::is_empty")]
92 #[serde(default)]
93 pub span_data_table: Vec<u32>,
94}
95
96#[derive(Clone, Copy, Default, Debug, Serialize, Deserialize)]
97pub struct ExpnGlobals {
98 #[serde(skip_serializing)]
99 #[serde(default)]
100 pub serialize: bool,
101 pub def_site: usize,
102 pub call_site: usize,
103 pub mixed_site: usize,
104}
105
106impl ExpnGlobals {
107 fn skip_serializing_if(&self) -> bool {
108 !self.serialize
109 }
110}
111
112impl Message for BidirectionalMessage {}