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}