clangd_parser/
srcs.rs

1use crate::clangd::ClangdUtility;
2
3use griff::ChunkStream;
4
5#[derive(Debug, Clone, Default)]
6#[repr(u8)]
7pub enum SourceFlags {
8    #[default]
9    None,
10
11    IsTU = 1 << 0,
12    HadErrors = 1 << 1,
13}
14impl From<u8> for SourceFlags {
15    fn from(b: u8) -> Self {
16        use SourceFlags::*;
17        match b {
18            1 => IsTU,
19            2 => HadErrors,
20            _ => None,
21        }
22    }
23}
24
25#[derive(Clone, Debug, Default)]
26pub struct Srcs {
27    pub flags: SourceFlags,
28    pub uri: String,
29    pub digest: [u8; 8],
30    pub direct_includes: Vec<String>,
31
32}
33impl ClangdUtility for Srcs{}
34
35impl Srcs {
36    #[allow(dead_code)]
37    pub fn parse(stream: &ChunkStream, string_table: &Vec<String>) -> Vec<Srcs> {
38        let mut cursor: usize = 0;
39        let mut idx: u32;
40        let _data = stream.data.clone();
41        let data = _data.as_slice();
42        let mut srcs: Vec<Srcs> = vec![];
43        if data.len() == 0 {
44            return srcs;
45        }
46
47        loop {
48            let mut src: Srcs = Default::default();
49            src.flags = SourceFlags::from(data[cursor]);
50            cursor += 1;
51            let (sz, content) = Self::get_string(data.get(cursor..).unwrap(), string_table);
52            src.uri = content;
53            cursor += sz;
54            src.digest = data.get(cursor..cursor+8).unwrap().try_into().unwrap();
55            cursor += 8;
56            let (sz, len) = Self::get_varint(data.get(cursor..).unwrap());
57            cursor += sz;
58            idx = 0;
59            while idx < len {
60                let (sz, content) = Self::get_string(data.get(cursor..).unwrap(), string_table);
61                src.direct_includes.push(content);
62                cursor += sz;
63                idx += 1;
64            }
65            srcs.push(src);
66            
67            if cursor >= data.len() {
68                break;
69            }
70        }
71        srcs
72    }
73}