cmake_parser/doc/
mod.rs

1mod cmake_parse;
2mod cmake_positional;
3pub mod command;
4mod command_scope;
5mod token;
6
7use crate::CMakeListsTokens;
8
9pub use cmake_parse::CMakeParse;
10pub use cmake_positional::{CMakePositional, Keyword};
11use command::CommandParseError;
12
13pub use command::Command;
14pub use command_scope::{CommandScope, ToCommandScope};
15pub use token::{declarations_by_keywords, TextNodeDeclaration, Token, TokenDeclarations};
16
17pub struct Doc<'t> {
18    tokens: CMakeListsTokens<'t>,
19}
20
21impl<'t> Doc<'t> {
22    pub fn to_commands_iter<'a: 't>(
23        &'a self,
24    ) -> impl Iterator<Item = Result<Command<'t>, CommandParseError>> {
25        self.tokens
26            .command_invocations()
27            .map(|ci| (ci.identifier(), ci.to_text_nodes()))
28            .map(move |(identifier, tokens)| match &identifier[..] {
29                b"add_compile_definitions" => to_command(tokens, Command::AddCompileDefinitions),
30                b"add_compile_options" => to_command(tokens, Command::AddCompileOptions),
31                b"add_custom_command" => to_command(tokens, Command::AddCustomCommand),
32                b"add_custom_target" => to_command(tokens, Command::AddCustomTarget),
33                b"add_definitions" => to_command(tokens, Command::AddDefinitions),
34                b"add_dependencies" => to_command(tokens, Command::AddDependencies),
35                b"add_executable" => to_command(tokens, Command::AddExecutable),
36                b"add_library" => to_command(tokens, Command::AddLibrary),
37                b"add_link_options" => to_command(tokens, Command::AddLinkOptions),
38                b"add_subdirectory" => to_command(tokens, Command::AddSubdirectory),
39                b"add_test" => to_command(tokens, Command::AddTest),
40                b"aux_source_directory" => to_command(tokens, Command::AuxSourceDirectory),
41                b"build_command" => to_command(tokens, Command::BuildCommand),
42                b"create_test_sourcelist" => to_command(tokens, Command::CreateTestSourceList),
43                b"define_property" => to_command(tokens, Command::DefineProperty),
44                b"enable_language" => to_command(tokens, Command::EnableLanguage),
45                b"enable_testing" => Ok(Command::EnableTesting),
46                b"export" => to_command(tokens, Command::Export),
47                b"fltk_wrap_ui" => to_command(tokens, Command::FLTKWrapUI),
48                b"get_source_file_property" => to_command(tokens, Command::GetSourceFileProperty),
49                b"get_target_property" => to_command(tokens, Command::GetTargetProperty),
50                b"get_test_property" => to_command(tokens, Command::GetTestProperty),
51                b"include_directories" => to_command(tokens, Command::IncludeDirectories),
52                b"include_external_msproject" => {
53                    to_command(tokens, Command::IncludeExternalMSProject)
54                }
55                b"include_regular_expression" => {
56                    to_command(tokens, Command::IncludeRegularExpression)
57                }
58                b"install" => to_command(tokens, Command::Install),
59                b"link_directories" => to_command(tokens, Command::LinkDirectories),
60                b"link_libraries" => to_command(tokens, Command::LinkLibraries),
61                b"load_cache" => to_command(tokens, Command::LoadCache),
62                b"project" => to_command(tokens, Command::Project),
63                b"remove_definitions" => to_command(tokens, Command::RemoveDefinitions),
64                b"set_source_files_properties" => {
65                    to_command(tokens, Command::SetSourceFileProperties)
66                }
67                b"set_target_properties" => to_command(tokens, Command::SetTargetProperties),
68                b"set_tests_properties" => to_command(tokens, Command::SetTestsProperties),
69                b"source_group" => to_command(tokens, Command::SourceGroup),
70                b"target_compile_definitions" => {
71                    to_command(tokens, Command::TargetCompileDefinitions)
72                }
73                b"target_compile_features" => to_command(tokens, Command::TargetCompileFeatures),
74                b"target_compile_options" => to_command(tokens, Command::TargetCompileOptions),
75                b"target_include_directories" => {
76                    to_command(tokens, Command::TargetIncludeDirectories)
77                }
78                b"target_link_directories" => to_command(tokens, Command::TargetLinkDirectories),
79                b"target_link_libraries" => to_command(tokens, Command::TargetLinkLibraries),
80                b"target_link_options" => to_command(tokens, Command::TargetLinkOptions),
81                b"target_precompile_headers" => {
82                    to_command(tokens, Command::TargetPrecompileHeaders)
83                }
84                b"target_sources" => to_command(tokens, Command::TargetSources),
85                b"try_compile" => to_command(tokens, Command::TryCompile),
86                b"try_run" => to_command(tokens, Command::TryRun),
87                b"ctest_build" => to_command(tokens, Command::CTestBuild),
88                b"ctest_configure" => to_command(tokens, Command::CTestConfigure),
89                b"ctest_coverage" => to_command(tokens, Command::CTestCoverage),
90                b"ctest_empty_binary_directory" => {
91                    to_command(tokens, Command::CTestEmptyBinaryDirectory)
92                }
93                b"ctest_memcheck" => to_command(tokens, Command::CTestMemCheck),
94                b"ctest_read_custom_files" => to_command(tokens, Command::CTestReadCustomFiles),
95                b"ctest_run_script" => to_command(tokens, Command::CTestRunScript),
96                b"ctest_sleep" => to_command(tokens, Command::CTestSleep),
97                b"ctest_start" => to_command(tokens, Command::CTestStart),
98                b"ctest_submit" => to_command(tokens, Command::CTestSubmit),
99                b"ctest_test" => to_command(tokens, Command::CTestTest),
100                b"ctest_update" => to_command(tokens, Command::CTestUpdate),
101                b"ctest_upload" => to_command(tokens, Command::CTestUpload),
102                b"build_name" => to_command(tokens, Command::BuildName),
103                b"exec_program" => to_command(tokens, Command::ExecProgram),
104                b"export_library_dependencies" => {
105                    to_command(tokens, Command::ExportLibraryDependencies)
106                }
107                b"install_files" => to_command(tokens, Command::InstallFiles),
108                b"install_programs" => to_command(tokens, Command::InstallPrograms),
109                b"install_targets" => to_command(tokens, Command::InstallTargets),
110                b"load_command" => to_command(tokens, Command::LoadCommand),
111                b"make_directory" => to_command(tokens, Command::MakeDirectory),
112                b"output_required_files" => to_command(tokens, Command::OutputRequiredFiles),
113                b"qt_wrap_cpp" => to_command(tokens, Command::QtWrapCpp),
114                b"qt_wrap_ui" => to_command(tokens, Command::QtWrapUi),
115                b"remove" => to_command(tokens, Command::Remove),
116                b"subdir_depends" => to_command(tokens, Command::SubdirDepends),
117                b"subdirs" => to_command(tokens, Command::Subdirs),
118                b"use_mangled_mesa" => to_command(tokens, Command::UseMangledMesa),
119                b"utility_source" => to_command(tokens, Command::UtilitySource),
120                b"variable_requires" => to_command(tokens, Command::VariableRequires),
121                b"write_file" => to_command(tokens, Command::WriteFile),
122                b"block" => to_command(tokens, Command::Block),
123                b"break" => to_command(tokens, Command::Break),
124                b"cmake_host_system_information" => {
125                    to_command(tokens, Command::CMakeHostSystemInformation)
126                }
127                b"cmake_language" => to_command(tokens, Command::CMakeLanguage),
128                b"cmake_minimum_required" => to_command(tokens, Command::CMakeMinimumRequired),
129                b"cmake_parse_arguments" => to_command(tokens, Command::CMakeParseArguments),
130                b"cmake_path" => to_command(tokens, Command::CMakePath),
131                b"cmake_policy" => to_command(tokens, Command::CMakePolicy),
132                b"configure_file" => to_command(tokens, Command::ConfigureFile),
133                b"continue" => to_command(tokens, Command::Continue),
134                b"else" => to_command(tokens, Command::Else),
135                b"elseif" => to_command(tokens, Command::ElseIf),
136                b"endblock" => to_command(tokens, Command::EndBlock),
137                b"endforeach" => to_command(tokens, Command::EndForEach),
138                b"endfunction" => to_command(tokens, Command::EndFunction),
139                b"endif" => to_command(tokens, Command::EndIf),
140                b"endmacro" => to_command(tokens, Command::EndMacro),
141                b"endwhile" => to_command(tokens, Command::EndWhile),
142                b"execute_process" => to_command(tokens, Command::ExecuteProcess),
143                b"file" => to_command(tokens, Command::File),
144                b"find_file" => to_command(tokens, Command::FindFile),
145                b"find_library" => to_command(tokens, Command::FindLibrary),
146                b"find_package" => to_command(tokens, Command::FindPackage),
147                b"find_path" => to_command(tokens, Command::FindPath),
148                b"find_program" => to_command(tokens, Command::FindProgram),
149                b"foreach" => to_command(tokens, Command::ForEach),
150                b"function" => to_command(tokens, Command::Function),
151                b"get_cmake_property" => to_command(tokens, Command::GetCMakeProperty),
152                b"get_directory_property" => to_command(tokens, Command::GetDirectoryProperty),
153                b"get_filename_component" => to_command(tokens, Command::GetFilenameComponent),
154                b"get_property" => to_command(tokens, Command::GetProperty),
155                b"if" => to_command(tokens, Command::If),
156                b"include" => to_command(tokens, Command::Include),
157                b"include_guard" => to_command(tokens, Command::IncludeGuard),
158                b"list" => to_command(tokens, Command::List),
159                b"macro" => to_command(tokens, Command::Macro),
160                b"mark_as_advanced" => to_command(tokens, Command::MarkAsAdvanced),
161                b"math" => to_command(tokens, Command::Math),
162                b"message" => to_command(tokens, Command::Message),
163                b"option" => to_command(tokens, Command::Option),
164                b"return" => to_command(tokens, Command::Return),
165                b"separate_arguments" => to_command(tokens, Command::SeparateArguments),
166                b"set" => to_command(tokens, Command::Set),
167                b"set_directory_properties" => to_command(tokens, Command::SetDirectoryProperties),
168                b"set_property" => to_command(tokens, Command::SetProperty),
169                b"site_name" => to_command(tokens, Command::SiteName),
170                b"string" => to_command(tokens, Command::String),
171                b"unset" => to_command(tokens, Command::Unset),
172                b"variable_watch" => to_command(tokens, Command::VariableWatch),
173                b"while" => to_command(tokens, Command::While),
174                unknown => Err(CommandParseError::UnknownCommand(
175                    String::from_utf8_lossy(unknown).to_string(),
176                )),
177            })
178    }
179
180    pub fn commands<'a: 't>(&'a self) -> Result<Vec<Command<'t>>, CommandParseError> {
181        self.to_commands_iter().collect()
182    }
183}
184
185impl<'t> From<CMakeListsTokens<'t>> for Doc<'t> {
186    fn from(tokens: CMakeListsTokens<'t>) -> Self {
187        Self { tokens }
188    }
189}
190fn to_command<'t, C, F>(tokens: Vec<Token<'t>>, f: F) -> Result<Command<'t>, CommandParseError>
191where
192    C: CMakeParse<'t>,
193    F: Fn(Box<C>) -> Command<'t>,
194{
195    CMakeParse::complete(&tokens).map(f)
196}