1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
use cmake_parser_derive::CMake;

use crate::{
    command::common::Property,
    doc::command_scope::{CommandScope, ToCommandScope},
    Token,
};

/// Sets properties associated with source files using a key/value paired list.
///
/// Reference: <https://cmake.org/cmake/help/v3.26/command/set_source_files_properties.html>
#[derive(CMake, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[cmake(pkg = "crate", default = "files")]
pub struct SetSourceFileProperties<'t> {
    #[cmake(rename = "")]
    pub files: Vec<Token<'t>>,
    #[cmake(rename = "DIRECTORY")]
    pub directories: Option<Vec<Token<'t>>>,
    #[cmake(rename = "TARGET_DIRECTORY")]
    pub targets: Option<Vec<Token<'t>>>,
    pub properties: Vec<Property<'t>>,
}

impl<'t> ToCommandScope for SetSourceFileProperties<'t> {
    fn to_command_scope(&self) -> CommandScope {
        CommandScope::Project
    }
}

#[cfg(test)]
mod tests {
    use super::*;
    use crate::doc::cmake_parse::tests::{quoted_token, token, tokens_vec};
    use crate::*;
    use pretty_assertions::assert_eq;

    #[test]
    fn set_source_files_properties() {
        let src =
            include_bytes!("../../../../../fixture/commands/project/set_source_files_properties");
        let cmakelists = parse_cmakelists(src).unwrap();
        let doc = Doc::from(cmakelists);
        assert_eq!(
            doc.commands(),
            Ok(vec![
                Command::SetSourceFileProperties(Box::new(SetSourceFileProperties {
                    files: tokens_vec([b"a.cpp"]),
                    directories: None,
                    targets: None,
                    properties: vec![Property {
                        prop: token(b"COMPILE_DEFINITIONS"),
                        value: quoted_token(b"DIR1=/home/x x/b.i;DIR2=/home/xxx/c.i"),
                    }]
                })),
                Command::SetSourceFileProperties(Box::new(SetSourceFileProperties {
                    files: tokens_vec([b"example.i", b"example.q"]),
                    directories: Some(tokens_vec([b"qqq1", b"qqq2"])),
                    targets: Some(tokens_vec([b"ddd1", b"ddd2"])),
                    properties: vec![
                        Property {
                            prop: token(b"CPLUSPLUS"),
                            value: token(b"ON"),
                        },
                        Property {
                            prop: token(b"SWIG_FLAGS"),
                            value: quoted_token(b"-includeall"),
                        }
                    ]
                })),
            ])
        )
    }
}