diff --git a/crates/qt-build-utils/src/lib.rs b/crates/qt-build-utils/src/lib.rs index 33345109b..3a8ecb891 100644 --- a/crates/qt-build-utils/src/lib.rs +++ b/crates/qt-build-utils/src/lib.rs @@ -34,7 +34,7 @@ mod platform; pub use platform::QtPlatformLinker; mod qml; -pub use qml::{QmlDirBuilder, QmlPluginCppBuilder, QmlUri}; +pub use qml::{QmlDirBuilder, QmlLsIniBuilder, QmlPluginCppBuilder, QmlUri}; mod qrc; pub use qrc::{QResource, QResourceFile, QResources}; diff --git a/crates/qt-build-utils/src/qml/mod.rs b/crates/qt-build-utils/src/qml/mod.rs index 0992522e7..6e972e2e7 100644 --- a/crates/qt-build-utils/src/qml/mod.rs +++ b/crates/qt-build-utils/src/qml/mod.rs @@ -6,6 +6,9 @@ mod qmldir; pub use qmldir::QmlDirBuilder; +mod qmlls; +pub use qmlls::QmlLsIniBuilder; + mod qmlplugincpp; pub use qmlplugincpp::QmlPluginCppBuilder; diff --git a/crates/qt-build-utils/src/qml/qmlls.rs b/crates/qt-build-utils/src/qml/qmlls.rs new file mode 100644 index 000000000..8108c6096 --- /dev/null +++ b/crates/qt-build-utils/src/qml/qmlls.rs @@ -0,0 +1,84 @@ +// SPDX-FileCopyrightText: 2025 Klarälvdalens Datakonsult AB, a KDAB Group company +// SPDX-FileContributor: Andrew Hayzen +// +// SPDX-License-Identifier: MIT OR Apache-2.0 + +use std::{ + io, + path::{Path, PathBuf}, +}; + +/// A helper for building QML Language Server configuration files +#[derive(Default)] +pub struct QmlLsIniBuilder { + build_dir: Option, + no_cmake_calls: Option, +} + +impl QmlLsIniBuilder { + /// Construct a [QmlLsIniBuilder] + pub fn new() -> Self { + Self::default() + } + + /// Use the given build_dir + pub fn build_dir(mut self, build_dir: impl AsRef) -> Self { + self.build_dir = Some(build_dir.as_ref().to_path_buf()); + self + } + + /// Enable or disable cmake calls + pub fn no_cmake_calls(mut self, no_cmake_calls: bool) -> Self { + self.no_cmake_calls = Some(no_cmake_calls); + self + } + + /// Write the resultant qmlls ini file contents + pub fn write(self, writer: &mut impl io::Write) -> io::Result<()> { + if self.build_dir.is_none() && self.no_cmake_calls.is_none() { + return Ok(()); + } + + writeln!(writer, "[General]")?; + + if let Some(build_dir) = self.build_dir { + writeln!( + writer, + "buildDir=\"{}\"", + build_dir.to_string_lossy().escape_default() + )?; + } + + if let Some(no_cmake_calls) = self.no_cmake_calls { + writeln!( + writer, + "no-cmake-calls={}", + if no_cmake_calls { "true" } else { "false" } + )?; + } + + Ok(()) + } +} + +#[cfg(test)] +mod test { + use super::*; + + #[test] + fn qmlls() { + let mut result = Vec::new(); + QmlLsIniBuilder::new() + .build_dir("/a/b/c") + .no_cmake_calls(true) + .write(&mut result) + .unwrap(); + assert_eq!( + String::from_utf8(result).unwrap(), + "[General] +buildDir=\"/a/b/c\" +no-cmake-calls=true +" + ); + } +}