Skip to content

Commit 2cd19c9

Browse files
committed
cli: use new diff technology too
1 parent 176a32f commit 2cd19c9

File tree

5 files changed

+71
-37
lines changed

5 files changed

+71
-37
lines changed

src/analyses/compute_rules.rs

+10-8
Original file line numberDiff line numberDiff line change
@@ -337,7 +337,7 @@ impl RenderablePredicate<'_> {
337337
}
338338

339339
/// Intermediate representation used in the display process.
340-
pub(crate) struct RenderableTypingRule<'a> {
340+
struct RenderableTypingRule<'a> {
341341
name: Rule,
342342
preconditions: Vec<RenderablePredicate<'a>>,
343343
postconditions: Vec<RenderablePredicate<'a>>,
@@ -353,7 +353,7 @@ impl<'a> TypingRule<'a> {
353353
cstrs
354354
}
355355

356-
pub(crate) fn make_renderable(
356+
fn make_renderable(
357357
&'a self,
358358
_a: &'a Arenas<'a>,
359359
style: PredicateStyle,
@@ -444,19 +444,21 @@ impl<'a> TypingRule<'a> {
444444
options: self.options,
445445
})
446446
}
447+
pub fn display_to_tree<'d>(
448+
&self,
449+
a: &'d Arenas<'d>,
450+
style: PredicateStyle,
451+
) -> Result<DisplayTree<'d>, IncompatibleStyle> {
452+
Ok(self.make_renderable(a, style)?.display_to_tree(a, style))
453+
}
447454

448455
pub fn display(&self, style: PredicateStyle) -> Result<String, IncompatibleStyle> {
449456
let a = &Arenas::default();
450-
Ok(self.make_renderable(a, style)?.display(style))
457+
Ok(self.display_to_tree(a, style)?.to_string())
451458
}
452459
}
453460

454461
impl<'a> RenderableTypingRule<'a> {
455-
pub fn display(&self, style: PredicateStyle) -> String {
456-
let a = &Arenas::default();
457-
self.display_to_tree(a, style).to_string()
458-
}
459-
460462
pub fn display_to_tree<'d>(&self, a: &'d Arenas<'d>, style: PredicateStyle) -> DisplayTree<'d> {
461463
let preconditions = DisplayTree::sep_by(
462464
a,

src/ast/printer.rs

+27-13
Original file line numberDiff line numberDiff line change
@@ -6,68 +6,82 @@ use crate::*;
66
pub mod display_tree;
77
pub use display_tree::*;
88

9-
pub trait Style {
9+
pub trait Style: Display + AsRef<str> {
1010
fn green(&self) -> String;
1111
fn red(&self) -> String;
1212
fn comment(&self) -> String;
1313
fn dimmed(&self) -> String;
1414
fn tooltip(&self, text: &str) -> String;
1515
fn inherited_ref(&self) -> String;
1616
fn code(&self) -> String;
17+
18+
fn wrap_in_tag(&self, tag_name: &str, tag_args: Option<(&str, &str)>) -> String {
19+
let tag_args = tag_args
20+
.map(|(k, v)| format!("{k}=\"{v}\""))
21+
.unwrap_or_default();
22+
format!("<{tag_name} {tag_args}>{self}</{tag_name}>")
23+
}
24+
fn span_style(&self, style: &str) -> String {
25+
self.wrap_in_tag("span", Some(("style", style)))
26+
}
27+
fn apply_colorize<'a>(&'a self, f: impl Fn(&'a str) -> colored::ColoredString) -> String {
28+
// Apply line-by-line so that we can split by line later without messing up escape codes.
29+
self.as_ref().lines().map(|line| f(line)).join("\n")
30+
}
1731
}
1832

1933
impl<T: Display + AsRef<str>> Style for T {
2034
fn green(&self) -> String {
2135
if cfg!(target_arch = "wasm32") {
22-
format!("<span style=\"color: green\">{self}</span>")
36+
self.span_style("color: green")
2337
} else {
2438
use colored::Colorize;
25-
<_ as Colorize>::green(self.as_ref()).to_string()
39+
self.apply_colorize(<_ as Colorize>::green)
2640
}
2741
}
2842
fn red(&self) -> String {
2943
if cfg!(target_arch = "wasm32") {
30-
format!("<span style=\"color: red\">{self}</span>")
44+
self.span_style("color: red")
3145
} else {
3246
use colored::Colorize;
33-
<_ as Colorize>::red(self.as_ref()).to_string()
47+
self.apply_colorize(<_ as Colorize>::red)
3448
}
3549
}
3650
fn dimmed(&self) -> String {
3751
if cfg!(target_arch = "wasm32") {
38-
format!("<span style=\"opacity: 0.5\">{self}</span>")
52+
self.span_style("opacity: 0.5")
3953
} else {
4054
use colored::Colorize;
41-
<_ as Colorize>::dimmed(self.as_ref()).to_string()
55+
self.apply_colorize(<_ as Colorize>::dimmed)
4256
}
4357
}
4458
fn comment(&self) -> String {
4559
if cfg!(target_arch = "wasm32") {
46-
format!("<span style=\"color: dimgray\">{self}</span>")
60+
self.span_style("color: dimgray")
4761
} else {
4862
use colored::Colorize;
49-
<_ as Colorize>::dimmed(self.as_ref()).to_string()
63+
self.apply_colorize(<_ as Colorize>::dimmed)
5064
}
5165
}
5266
fn tooltip(&self, text: &str) -> String {
5367
if cfg!(target_arch = "wasm32") {
54-
format!("<span title=\"{text}\">{self}</span>")
68+
self.wrap_in_tag("span", Some(("title", text)))
5569
} else {
5670
self.to_string()
5771
}
5872
}
5973
fn inherited_ref(&self) -> String {
6074
if cfg!(target_arch = "wasm32") {
61-
format!("<span class=\"inherited-ref\">{self}</span>")
75+
self.wrap_in_tag("span", Some(("class", "inherited-ref")))
6276
} else {
6377
use colored::Colorize;
64-
<_ as Colorize>::dimmed(self.as_ref()).to_string()
78+
self.apply_colorize(<_ as Colorize>::dimmed)
6579
}
6680
.tooltip("inherited reference")
6781
}
6882
fn code(&self) -> String {
6983
if cfg!(target_arch = "wasm32") {
70-
format!("<code>{self}</code>")
84+
self.wrap_in_tag("code", None)
7185
} else {
7286
format!("`{self}`")
7387
}

src/ast/printer/display_tree.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ pub struct DisplayTree<'a> {
3131

3232
/// Compute the length of this string as displayed on the screen (i.e. ignoring html tags or ansi
3333
/// escapes, depending on context).
34-
fn len_ignoring_markup(s: &str) -> usize {
34+
pub(crate) fn len_ignoring_markup(s: &str) -> usize {
3535
if cfg!(target_arch = "wasm32") {
3636
// Compute string length skipping html tags.
3737
let mut in_tag = false;

src/cli.rs

+31-11
Original file line numberDiff line numberDiff line change
@@ -106,23 +106,26 @@ impl CliState {
106106
right: RuleOptions,
107107
) -> Result<String, IncompatibleStyle> {
108108
let style = self.predicate_style;
109-
let arenas = &Arenas::default();
109+
let a = &Arenas::default();
110110
let type_of_interest = style.type_of_interest();
111-
let joint_rules = compute_joint_rules(arenas, type_of_interest, left, right);
111+
let joint_rules = compute_joint_rules(a, type_of_interest, left, right);
112112

113113
let mut out = String::new();
114114
for joint_rule in joint_rules {
115-
let (left, right) = joint_rule.left_and_right();
115+
let (left, right) = joint_rule.as_ref().left_and_right();
116116
let left = left
117-
.map(|r| r.display(style))
118-
.transpose()?
117+
.map(|r| r.display_to_tree(a, style).unwrap())
119118
.unwrap_or_default();
120119
let right = right
121-
.map(|r| r.display(style))
122-
.transpose()?
120+
.map(|r| r.display_to_tree(a, style).unwrap())
123121
.unwrap_or_default();
124-
out += &DiffState::side_by_side(&left, &right);
125-
let _ = writeln!(&mut out);
122+
let (mut left, mut right, has_diff) = left.diff_display_has_diff(&right);
123+
if !has_diff {
124+
left = left.dimmed();
125+
right = right.dimmed();
126+
}
127+
out += &side_by_side(&left, &right);
128+
out += "\n";
126129
}
127130
Ok(out)
128131
}
@@ -413,6 +416,19 @@ pub fn display_rules(
413416
Ok(out)
414417
}
415418

419+
fn side_by_side(left: &str, right: &str) -> String {
420+
let mut out = String::new();
421+
for x in left.lines().zip_longest(right.lines()) {
422+
let (l, r) = x.or("", "");
423+
let pad = 80usize
424+
.checked_sub(len_ignoring_markup(l))
425+
.unwrap_or_default();
426+
let pad = " ".repeat(pad);
427+
let _ = writeln!(&mut out, " {l}{pad} | {r}");
428+
}
429+
out
430+
}
431+
416432
#[derive(Clone, Copy, PartialEq, Eq)]
417433
enum DiffState {
418434
Both,
@@ -439,13 +455,17 @@ impl DiffState {
439455
use DiffState::*;
440456
let mut out = String::new();
441457
for x in left.lines().zip_longest(right.lines()) {
442-
let (l, r) = x.or(" ", " ");
458+
let (l, r) = x.or("", "");
459+
let pad = 80usize
460+
.checked_sub(len_ignoring_markup(l))
461+
.unwrap_or_default();
462+
let pad = " ".repeat(pad);
443463
let same = l == r;
444464
let l_state = if same { Both } else { Old };
445465
let r_state = if same { Both } else { New };
446466
let l = l_state.color_line(l);
447467
let r = r_state.color_line(r);
448-
let _ = writeln!(&mut out, " {l:80} | {r}");
468+
let _ = writeln!(&mut out, " {l}{pad} | {r}");
449469
}
450470
out
451471
}

src/wasm.rs

+2-4
Original file line numberDiff line numberDiff line change
@@ -278,12 +278,10 @@ pub fn display_joint_rules_js(
278278
.map(|joint_rule| {
279279
let (left, right) = joint_rule.as_ref().left_and_right();
280280
let left = left
281-
.map(|r| r.make_renderable(a, style).unwrap())
282-
.map(|r| r.display_to_tree(a, style))
281+
.map(|r| r.display_to_tree(a, style).unwrap())
283282
.unwrap_or_default();
284283
let right = right
285-
.map(|r| r.make_renderable(a, style).unwrap())
286-
.map(|r| r.display_to_tree(a, style))
284+
.map(|r| r.display_to_tree(a, style).unwrap())
287285
.unwrap_or_default();
288286
let (mut left, mut right, has_diff) = left.diff_display_has_diff(&right);
289287
if !has_diff {

0 commit comments

Comments
 (0)