proc_macro_api/bidirectional_protocol/
msg.rs

1//! Bidirectional protocol messages
2
3use 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    /// Line and column are 1-based.
34    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 {}