difftreelog
style fix all clippy warnings
in: master
3 files changed
.gitignorediffbeforeafterboth--- a/.gitignore
+++ b/.gitignore
@@ -4,3 +4,5 @@
.vscode
cache
+
+jsonnet-cpp
bindings/jsonnet/src/lib.rsdiffbeforeafterboth--- a/bindings/jsonnet/src/lib.rs
+++ b/bindings/jsonnet/src/lib.rs
@@ -65,11 +65,18 @@
}
#[no_mangle]
-pub extern "C" fn jsonnet_make() -> Box<EvaluationState> {
+pub extern "C" fn jsonnet_make() -> *mut EvaluationState {
let state = EvaluationState::default();
state.with_stdlib();
state.settings_mut().import_resolver = Box::new(NativeImportResolver::default());
- Box::new(state)
+ Box::into_raw(Box::new(state))
+}
+
+/// # Safety
+#[no_mangle]
+#[allow(clippy::boxed_local)]
+pub unsafe extern "C" fn jsonnet_destroy(vm: *mut EvaluationState) {
+ Box::from_raw(vm);
}
#[no_mangle]
@@ -133,31 +140,31 @@
pub unsafe extern "C" fn jsonnet_json_make_string(
_vm: &EvaluationState,
v: *const c_char,
-) -> Box<Val> {
+) -> *mut Val {
let cstr = CStr::from_ptr(v);
let str = cstr.to_str().unwrap();
- Box::new(Val::Str(str.into()))
+ Box::into_raw(Box::new(Val::Str(str.into())))
}
#[no_mangle]
-pub extern "C" fn jsonnet_json_make_number(_vm: &EvaluationState, v: c_double) -> Box<Val> {
- Box::new(Val::Num(v))
+pub extern "C" fn jsonnet_json_make_number(_vm: &EvaluationState, v: c_double) -> *mut Val {
+ Box::into_raw(Box::new(Val::Num(v)))
}
#[no_mangle]
-pub extern "C" fn jsonnet_json_make_bool(_vm: &EvaluationState, v: c_int) -> Box<Val> {
+pub extern "C" fn jsonnet_json_make_bool(_vm: &EvaluationState, v: c_int) -> *mut Val {
assert!(v == 0 || v == 1);
- Box::new(Val::Bool(v == 1))
+ Box::into_raw(Box::new(Val::Bool(v == 1)))
}
#[no_mangle]
-pub extern "C" fn jsonnet_json_make_null(_vm: &EvaluationState) -> Box<Val> {
- Box::new(Val::Null)
+pub extern "C" fn jsonnet_json_make_null(_vm: &EvaluationState) -> *mut Val {
+ Box::into_raw(Box::new(Val::Null))
}
#[no_mangle]
-pub extern "C" fn jsonnet_json_make_array(_vm: &EvaluationState) -> Box<Val> {
- Box::new(Val::Arr(Rc::new(Vec::new())))
+pub extern "C" fn jsonnet_json_make_array(_vm: &EvaluationState) -> *mut Val {
+ Box::into_raw(Box::new(Val::Arr(Rc::new(Vec::new()))))
}
#[no_mangle]
@@ -175,8 +182,8 @@
}
#[no_mangle]
-pub extern "C" fn jsonnet_json_make_object(_vm: &EvaluationState) -> Box<Val> {
- Box::new(Val::Obj(ObjValue::new_empty()))
+pub extern "C" fn jsonnet_json_make_object(_vm: &EvaluationState) -> *mut Val {
+ Box::into_raw(Box::new(Val::Obj(ObjValue::new_empty())))
}
/// # Safety
@@ -233,9 +240,12 @@
std::alloc::realloc(buf, old_layout, sz)
}
+/// # Safety
#[no_mangle]
#[allow(clippy::boxed_local)]
-pub extern "C" fn jsonnet_json_destroy(_vm: &EvaluationState, _v: Box<Val>) {}
+pub unsafe extern "C" fn jsonnet_json_destroy(_vm: &EvaluationState, v: *mut Val) {
+ Box::from_raw(v);
+}
#[no_mangle]
pub extern "C" fn jsonnet_import_callback() {
@@ -362,7 +372,3 @@
pub extern "C" fn jsonnet_evaluate_snippet_stream() {
todo!()
}
-
-#[no_mangle]
-#[allow(clippy::boxed_local)]
-pub extern "C" fn jsonnet_destroy(_vm: Box<EvaluationState>) {}
crates/jrsonnet-trace/src/lib.rsdiffbeforeafterboth1use jrsonnet_evaluator::{2 trace::{offset_to_location, CodeLocation},3 EvaluationState, LocError,4};5use std::path::PathBuf;67/// How paths should be displayed8pub enum PathResolver {9 /// Only filename will be shown10 FileName,11 /// Absolute path of file12 Absolute,13 /// Relative path from base directory14 Relative(PathBuf),15}1617impl PathResolver {18 pub fn resolve(&self, from: &PathBuf) -> String {19 match self {20 PathResolver::FileName => from.file_name().unwrap().to_string_lossy().into_owned(),21 PathResolver::Absolute => from.to_string_lossy().into_owned(),22 PathResolver::Relative(base) => {23 if from.is_relative() {24 return from.to_string_lossy().into_owned();25 }26 pathdiff::diff_paths(from, base)27 .unwrap()28 .to_string_lossy()29 .into_owned()30 }31 }32 }33}3435/// Implements trace to string pretty-printing36pub trait TraceFormat {37 fn write_trace(38 &self,39 out: &mut dyn std::io::Write,40 evaluation_state: &EvaluationState,41 error: &LocError,42 ) -> Result<(), std::io::Error>;43 fn print_trace(44 &self,45 evaluation_state: &EvaluationState,46 error: &LocError,47 ) -> Result<(), std::io::Error> {48 self.write_trace(&mut std::io::stdout(), evaluation_state, error)49 }50}5152fn print_code_location(53 out: &mut impl std::fmt::Write,54 start: &CodeLocation,55 end: &CodeLocation,56) -> Result<(), std::fmt::Error> {57 if start.line == end.line {58 if start.column == end.column {59 write!(out, "{}:{}", start.line, end.column - 1)?;60 } else {61 write!(out, "{}:{}-{}", start.line, start.column - 1, end.column)?;62 }63 } else {64 write!(65 out,66 "{}:{}-{}:{}",67 start.line,68 end.column - 1,69 start.line,70 end.column71 )?;72 }73 Ok(())74}7576/// vanilla jsonnet like formatting77pub struct CompactFormat {78 pub resolver: PathResolver,79}8081impl TraceFormat for CompactFormat {82 fn write_trace(83 &self,84 out: &mut dyn std::io::Write,85 evaluation_state: &EvaluationState,86 error: &LocError,87 ) -> Result<(), std::io::Error> {88 writeln!(out, "{:?}", error.0)?;89 let file_names = (error.1)90 .091 .iter()92 .map(|el| {93 let resolved_path = self.resolver.resolve(&(el.0).0);94 // TODO: Process all trace elements first95 let location =96 evaluation_state.map_source_locations(&(el.0).0, &[(el.0).1, (el.0).2]);97 (resolved_path, location)98 })99 .map(|(mut n, location)| {100 use std::fmt::Write;101 write!(n, ":").unwrap();102 print_code_location(&mut n, &location[0], &location[1]).unwrap();103 n104 })105 .collect::<Vec<_>>();106 let align = file_names.iter().map(|e| e.len()).max().unwrap_or(0);107 for (i, (el, file)) in (error.1).0.iter().zip(file_names).enumerate() {108 if i != 0 {109 writeln!(out)?;110 }111 write!(out, "{:<w$}: {}", file, el.1, w = align)?;112 }113 Ok(())114 }115}116117/// rustc-like trace displaying118pub struct ExplainingFormat {119 pub resolver: PathResolver,120}121impl TraceFormat for ExplainingFormat {122 fn write_trace(123 &self,124 out: &mut dyn std::io::Write,125 evaluation_state: &EvaluationState,126 error: &LocError,127 ) -> Result<(), std::io::Error> {128 use annotate_snippets::{129 display_list::{DisplayList, FormatOptions},130 snippet::{AnnotationType, Slice, Snippet, SourceAnnotation},131 };132 writeln!(out, "{:?}", error.0)?;133 let trace = &error.1;134 for item in trace.0.iter() {135 let desc = &item.1;136 let source = item.0.clone();137 let start_end = evaluation_state.map_source_locations(&source.0, &[source.1, source.2]);138139 let source_fragment: String = evaluation_state140 .get_source(&source.0)141 .unwrap()142 .chars()143 .skip(start_end[0].line_start_offset)144 .take(start_end[1].line_end_offset - start_end[0].line_start_offset)145 .collect();146147 let origin = self.resolver.resolve(&source.0);148 let snippet = Snippet {149 opt: FormatOptions {150 color: true,151 ..Default::default()152 },153 title: None,154 footer: vec![],155 slices: vec![Slice {156 source: &source_fragment,157 line_start: start_end[0].line,158 origin: Some(&origin),159 fold: false,160 annotations: vec![SourceAnnotation {161 label: desc,162 annotation_type: AnnotationType::Error,163 range: (164 source.1 - start_end[0].line_start_offset,165 source.2 - start_end[0].line_start_offset,166 ),167 }],168 }],169 };170171 let dl = DisplayList::from(snippet);172 writeln!(out, "{}", dl)?;173 }174 Ok(())175 }176}1use jrsonnet_evaluator::{trace::CodeLocation, EvaluationState, LocError};2use std::path::PathBuf;34/// How paths should be displayed5pub enum PathResolver {6 /// Only filename will be shown7 FileName,8 /// Absolute path of file9 Absolute,10 /// Relative path from base directory11 Relative(PathBuf),12}1314impl PathResolver {15 pub fn resolve(&self, from: &PathBuf) -> String {16 match self {17 PathResolver::FileName => from.file_name().unwrap().to_string_lossy().into_owned(),18 PathResolver::Absolute => from.to_string_lossy().into_owned(),19 PathResolver::Relative(base) => {20 if from.is_relative() {21 return from.to_string_lossy().into_owned();22 }23 pathdiff::diff_paths(from, base)24 .unwrap()25 .to_string_lossy()26 .into_owned()27 }28 }29 }30}3132/// Implements trace to string pretty-printing33pub trait TraceFormat {34 fn write_trace(35 &self,36 out: &mut dyn std::io::Write,37 evaluation_state: &EvaluationState,38 error: &LocError,39 ) -> Result<(), std::io::Error>;40 fn print_trace(41 &self,42 evaluation_state: &EvaluationState,43 error: &LocError,44 ) -> Result<(), std::io::Error> {45 self.write_trace(&mut std::io::stdout(), evaluation_state, error)46 }47}4849fn print_code_location(50 out: &mut impl std::fmt::Write,51 start: &CodeLocation,52 end: &CodeLocation,53) -> Result<(), std::fmt::Error> {54 if start.line == end.line {55 if start.column == end.column {56 write!(out, "{}:{}", start.line, end.column - 1)?;57 } else {58 write!(out, "{}:{}-{}", start.line, start.column - 1, end.column)?;59 }60 } else {61 write!(62 out,63 "{}:{}-{}:{}",64 start.line,65 end.column - 1,66 start.line,67 end.column68 )?;69 }70 Ok(())71}7273/// vanilla jsonnet like formatting74pub struct CompactFormat {75 pub resolver: PathResolver,76}7778impl TraceFormat for CompactFormat {79 fn write_trace(80 &self,81 out: &mut dyn std::io::Write,82 evaluation_state: &EvaluationState,83 error: &LocError,84 ) -> Result<(), std::io::Error> {85 writeln!(out, "{:?}", error.0)?;86 let file_names = (error.1)87 .088 .iter()89 .map(|el| {90 let resolved_path = self.resolver.resolve(&(el.0).0);91 // TODO: Process all trace elements first92 let location =93 evaluation_state.map_source_locations(&(el.0).0, &[(el.0).1, (el.0).2]);94 (resolved_path, location)95 })96 .map(|(mut n, location)| {97 use std::fmt::Write;98 write!(n, ":").unwrap();99 print_code_location(&mut n, &location[0], &location[1]).unwrap();100 n101 })102 .collect::<Vec<_>>();103 let align = file_names.iter().map(|e| e.len()).max().unwrap_or(0);104 for (i, (el, file)) in (error.1).0.iter().zip(file_names).enumerate() {105 if i != 0 {106 writeln!(out)?;107 }108 write!(out, "{:<w$}: {}", file, el.1, w = align)?;109 }110 Ok(())111 }112}113114/// rustc-like trace displaying115pub struct ExplainingFormat {116 pub resolver: PathResolver,117}118impl TraceFormat for ExplainingFormat {119 fn write_trace(120 &self,121 out: &mut dyn std::io::Write,122 evaluation_state: &EvaluationState,123 error: &LocError,124 ) -> Result<(), std::io::Error> {125 use annotate_snippets::{126 display_list::{DisplayList, FormatOptions},127 snippet::{AnnotationType, Slice, Snippet, SourceAnnotation},128 };129 writeln!(out, "{:?}", error.0)?;130 let trace = &error.1;131 for item in trace.0.iter() {132 let desc = &item.1;133 let source = item.0.clone();134 let start_end = evaluation_state.map_source_locations(&source.0, &[source.1, source.2]);135136 let source_fragment: String = evaluation_state137 .get_source(&source.0)138 .unwrap()139 .chars()140 .skip(start_end[0].line_start_offset)141 .take(start_end[1].line_end_offset - start_end[0].line_start_offset)142 .collect();143144 let origin = self.resolver.resolve(&source.0);145 let snippet = Snippet {146 opt: FormatOptions {147 color: true,148 ..Default::default()149 },150 title: None,151 footer: vec![],152 slices: vec![Slice {153 source: &source_fragment,154 line_start: start_end[0].line,155 origin: Some(&origin),156 fold: false,157 annotations: vec![SourceAnnotation {158 label: desc,159 annotation_type: AnnotationType::Error,160 range: (161 source.1 - start_end[0].line_start_offset,162 source.2 - start_end[0].line_start_offset,163 ),164 }],165 }],166 };167168 let dl = DisplayList::from(snippet);169 writeln!(out, "{}", dl)?;170 }171 Ok(())172 }173}