mirror of
https://github.com/slint-ui/slint.git
synced 2025-10-01 14:21:16 +00:00
Add a diagnostics getter to ComponentCompiler
This commit is contained in:
parent
5b726cacbe
commit
e1f9347aaa
4 changed files with 71 additions and 0 deletions
|
@ -473,6 +473,9 @@ public:
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
using Diagnostic = sixtyfps::cbindgen_private::CDiagnostic;
|
||||||
|
using DiagnosticLevel = sixtyfps::cbindgen_private::CDiagnosticLevel;
|
||||||
|
|
||||||
class ComponentCompiler
|
class ComponentCompiler
|
||||||
{
|
{
|
||||||
cbindgen_private::ComponentCompilerOpaque inner;
|
cbindgen_private::ComponentCompilerOpaque inner;
|
||||||
|
@ -513,6 +516,13 @@ public:
|
||||||
return paths;
|
return paths;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sixtyfps::SharedVector<Diagnostic> diagnostics() const
|
||||||
|
{
|
||||||
|
sixtyfps::SharedVector<Diagnostic> result;
|
||||||
|
cbindgen_private::sixtyfps_interpreter_component_compiler_get_diagnostics(&inner, &result);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
std::optional<ComponentDefinition> build_from_source(std::string_view source_code,
|
std::optional<ComponentDefinition> build_from_source(std::string_view source_code,
|
||||||
std::string_view path)
|
std::string_view path)
|
||||||
{
|
{
|
||||||
|
|
|
@ -88,6 +88,22 @@ struct SharedString
|
||||||
/// \return true if the string contains no characters; false otherwise.
|
/// \return true if the string contains no characters; false otherwise.
|
||||||
bool empty() const { return std::string_view(*this).empty(); }
|
bool empty() const { return std::string_view(*this).empty(); }
|
||||||
|
|
||||||
|
/// \return true if the string starts with the specified prefix string; false otherwise
|
||||||
|
bool starts_with(std::string_view prefix) const
|
||||||
|
{
|
||||||
|
return std::string_view(*this).substr(0, prefix.size()) == prefix;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// \return true if the string ends with the specified prefix string; false otherwise
|
||||||
|
bool ends_with(std::string_view prefix) const
|
||||||
|
{
|
||||||
|
std::string_view self_view(*this);
|
||||||
|
return self_view.size() >= prefix.size()
|
||||||
|
&& self_view.compare(self_view.size() - prefix.size(), std::string_view::npos,
|
||||||
|
prefix)
|
||||||
|
== 0;
|
||||||
|
}
|
||||||
|
|
||||||
/// Creates a new SharedString from the given number \a n. The string representation of the
|
/// Creates a new SharedString from the given number \a n. The string representation of the
|
||||||
/// number uses a minimal formatting scheme: If \a n has no fractional part, the number will be
|
/// number uses a minimal formatting scheme: If \a n has no fractional part, the number will be
|
||||||
/// formatted as an integer.
|
/// formatted as an integer.
|
||||||
|
|
|
@ -282,6 +282,10 @@ SCENARIO("Component Compiler")
|
||||||
{
|
{
|
||||||
auto result = compiler.build_from_path(SOURCE_DIR "/file-not-there.60");
|
auto result = compiler.build_from_path(SOURCE_DIR "/file-not-there.60");
|
||||||
REQUIRE_FALSE(result.has_value());
|
REQUIRE_FALSE(result.has_value());
|
||||||
|
auto diags = compiler.diagnostics();
|
||||||
|
|
||||||
|
REQUIRE(diags.size() == 1);
|
||||||
|
REQUIRE(diags[0].message.starts_with("Could not load"));
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("Compile from path")
|
SECTION("Compile from path")
|
||||||
|
|
|
@ -1295,6 +1295,24 @@ pub(crate) mod ffi {
|
||||||
notify.as_model_notify().row_removed(row, count);
|
notify.as_model_notify().row_removed(row, count);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// FIXME: Figure out how to re-export the one from compilerlib
|
||||||
|
#[derive(Clone)]
|
||||||
|
#[repr(C)]
|
||||||
|
pub enum CDiagnosticLevel {
|
||||||
|
Error,
|
||||||
|
Warning,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Clone)]
|
||||||
|
#[repr(C)]
|
||||||
|
pub struct CDiagnostic {
|
||||||
|
message: SharedString,
|
||||||
|
source_file: SharedString,
|
||||||
|
line: usize,
|
||||||
|
column: usize,
|
||||||
|
level: CDiagnosticLevel,
|
||||||
|
}
|
||||||
|
|
||||||
#[repr(C)]
|
#[repr(C)]
|
||||||
pub struct ComponentCompilerOpaque([usize; 12]);
|
pub struct ComponentCompilerOpaque([usize; 12]);
|
||||||
/// Asserts that ComponentCompilerOpaque is as large as ComponentCompiler and has the same alignment, to make transmute safe.
|
/// Asserts that ComponentCompilerOpaque is as large as ComponentCompiler and has the same alignment, to make transmute safe.
|
||||||
|
@ -1373,6 +1391,29 @@ pub(crate) mod ffi {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
pub unsafe extern "C" fn sixtyfps_interpreter_component_compiler_get_diagnostics(
|
||||||
|
compiler: &ComponentCompilerOpaque,
|
||||||
|
out_diags: &mut SharedVector<CDiagnostic>,
|
||||||
|
) {
|
||||||
|
out_diags.extend(compiler.as_component_compiler().diagnostics.iter().map(|diagnostic| {
|
||||||
|
let (line, column) = diagnostic.line_column();
|
||||||
|
CDiagnostic {
|
||||||
|
message: diagnostic.message().into(),
|
||||||
|
source_file: diagnostic
|
||||||
|
.source_file()
|
||||||
|
.and_then(|path| path.to_str())
|
||||||
|
.map_or_else(|| Default::default(), |str| str.into()),
|
||||||
|
line,
|
||||||
|
column,
|
||||||
|
level: match diagnostic.level() {
|
||||||
|
DiagnosticLevel::Error => CDiagnosticLevel::Error,
|
||||||
|
DiagnosticLevel::Warning => CDiagnosticLevel::Warning,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe extern "C" fn sixtyfps_interpreter_component_compiler_build_from_source(
|
pub unsafe extern "C" fn sixtyfps_interpreter_component_compiler_build_from_source(
|
||||||
compiler: &mut ComponentCompilerOpaque,
|
compiler: &mut ComponentCompilerOpaque,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue