Split `annotations` and `graph` into 2 separate modules

finchie
May 8, 2024, 8:23 AM
WFBF7VS6OFN23TQBQGOPUOGMIHXVBTFJ2GFLDYET6IQLY7VOS7RAC

Dependencies

  • [2] UKNTVY7Z Add treemap visualization code
  • [3] L6QJNN62 Parse rustc self-profile data using `analyzeme`
  • [4] ZEN3WUPD Add support for histogram charts
  • [5] YA5ITLOV Add support for Sankey diagrams
  • [6] BRXHJFU7 Refactor measurements into `annotations` module
  • [7] OPTMCUTB Use timings `duration` to set size of rendered node
  • [8] ZPFD3275 Switch from `cargo_metadata`+`petgraph` to `guppy`
  • [9] LOR3KOXG Parse JSON output from `cargo build --timings`
  • [10] UXJFRBBL Move graph functionality into `graph` module
  • [11] V2NPEIA6 Use custom types to deserialize `--timings=json` output
  • [12] T34OV3YQ Store timings output in `timings::Output` struct
  • [13] 2H6RJC35 Account for floating point inaccuracy in histogram calculation
  • [14] B2L26LOA Store index of dependency nodes
  • [15] JVYWRCPT Add basic chart visualisation
  • [16] UQJO24KB Use `forceatlas2` to construct graph layout
  • [17] C43IWI7G Move visualization logic into separate module
  • [18] XVQXXAGZ Add support for generating treemaps
  • [19] 7CVIL7UJ Create simple metadata parser

Change contents

  • replacement in src/visualize/treemap.rs at line 1
    [2.35][2.36:60]()
    use crate::Annotations;
    [2.35]
    [2.60]
    use crate::AnnotationGraph;
  • replacement in src/visualize/treemap.rs at line 23
    [2.505][2.505:536]()
    annotations: &Annotations,
    [2.505]
    [2.536]
    annotations: &AnnotationGraph,
  • replacement in src/visualize/sankey.rs at line 1
    [4.34][4.0:49]()
    use crate::{Annotations, Measurement, Variable};
    [4.34]
    [4.55]
    use crate::{AnnotationGraph, Measurement, Variable};
  • replacement in src/visualize/sankey.rs at line 3
    [4.56][4.50:127]()
    pub fn nodes<'graph>(annotations: &'graph Annotations) -> Vec<&'graph str> {
    [4.56]
    [4.127]
    pub fn nodes<'graph>(annotations: &'graph AnnotationGraph) -> Vec<&'graph str> {
  • replacement in src/visualize/sankey.rs at line 10
    [4.218][4.243:340]()
    pub fn links<'graph>(annotations: &'graph Annotations) -> Vec<(&'graph str, &'graph str, f64)> {
    [4.218]
    [4.340]
    pub fn links<'graph>(annotations: &'graph AnnotationGraph) -> Vec<(&'graph str, &'graph str, f64)> {
  • replacement in src/visualize/mod.rs at line 18
    [4.277][4.870:937]()
    pub fn for_style(style: Style, annotations: &crate::Annotations) {
    [4.277]
    [4.359]
    pub fn for_style(style: Style, annotations: &crate::AnnotationGraph) {
  • replacement in src/visualize/histogram.rs at line 1
    [4.817][4.1345:1394]()
    use crate::{Annotations, Measurement, Variable};
    [4.817]
    [4.838]
    use crate::{AnnotationGraph, Measurement, Variable};
  • replacement in src/visualize/histogram.rs at line 26
    [4.1371][4.1395:1452]()
    pub fn axes(annotations: &Annotations) -> (Axis, Axis) {
    [4.1371]
    [4.1452]
    pub fn axes(annotations: &AnnotationGraph) -> (Axis, Axis) {
  • replacement in src/visualize/histogram.rs at line 49
    [4.2176][4.1655:1714]()
    pub fn data(annotations: &Annotations) -> Vec<DataPoint> {
    [4.2176]
    [4.1714]
    pub fn data(annotations: &AnnotationGraph) -> Vec<DataPoint> {
  • replacement in src/visualize/graph.rs at line 1
    [4.146][4.1916:1965]()
    use crate::{Annotations, Measurement, Variable};
    [4.146]
    [4.178]
    use crate::{AnnotationGraph, Measurement, Variable};
  • replacement in src/visualize/graph.rs at line 8
    [4.315][4.2013:2051]()
    annotations: &'graph Annotations,
    [4.315]
    [4.352]
    annotations: &'graph AnnotationGraph,
  • replacement in src/visualize/graph.rs at line 42
    [4.1551][4.2544:2616]()
    pub fn data(annotations: &Annotations) -> charming::series::GraphData {
    [4.1551]
    [4.1618]
    pub fn data(annotations: &AnnotationGraph) -> charming::series::GraphData {
  • edit in src/main.rs at line 6
    [4.3041]
    [4.1121]
    mod graph;
  • replacement in src/main.rs at line 9
    [4.1078][4.3042:3101]()
    pub use annotations::{Annotations, Measurement, Variable};
    [4.1078]
    [4.3101]
    pub use graph::{AnnotationGraph, Measurement, Variable};
  • edit in src/main.rs at line 15
    [4.3169]
    [4.2757]
    let self_profile = annotations::self_profile::ProfileCollection::new();
  • replacement in src/main.rs at line 20
    [4.897][4.3170:3253]()
    let annotations = annotations::Annotations::new(&package_graph, timings.repr);
    [4.897]
    [4.3253]
    let graph = AnnotationGraph::new(&package_graph, timings, self_profile);
  • replacement in src/main.rs at line 22
    [4.3254][4.3254:3321]()
    visualize::for_style(visualize::Style::Treemap, &annotations);
    [4.3254]
    [4.924]
    visualize::for_style(visualize::Style::Treemap, &graph);
  • file addition: graph (d--r------)
    [4.15]
  • file move: mod.rs (----------)mod.rs (----------)
    [0.1033]
    [4.3449]
  • replacement in src/graph/mod.rs at line 1
    [4.3449][4.3450:3481]()
    use std::collections::HashMap;
    [4.3449]
    [4.3481]
    use crate::annotations::{self_profile, timings};
  • edit in src/graph/mod.rs at line 11
    [4.3746][3.8097:8115](),[3.8115][4.3746:3764](),[4.3746][4.3746:3764]()
    mod self_profile;
    pub mod timings;
  • replacement in src/graph/mod.rs at line 36
    [4.4212][4.4212:4245]()
    pub struct Annotations<'graph> {
    [4.4212]
    [4.4245]
    pub struct AnnotationGraph<'graph> {
  • replacement in src/graph/mod.rs at line 42
    [4.4379][4.4379:4414]()
    impl<'graph> Annotations<'graph> {
    [4.4379]
    [4.4414]
    impl<'graph> AnnotationGraph<'graph> {
  • replacement in src/graph/mod.rs at line 45
    [4.4475][4.4475:4539]()
    mut timings: HashMap<PackageId, Vec<timings::Message>>,
    [4.4475]
    [4.4539]
    mut timings: timings::Output,
    self_profile: self_profile::ProfileCollection,
  • replacement in src/graph/mod.rs at line 48
    [4.4555][3.8116:8251]()
    let profile_data = self_profile::ProfileCollection::new();
    dbg!(profile_data.probes.len(), profile_data.crates.len());
    [4.4555]
    [3.8251]
    dbg!(self_profile.probes.len(), self_profile.crates.len());
  • replacement in src/graph/mod.rs at line 60
    [4.4926][4.4926:4971]()
    timings: timings.remove(id),
    [4.4926]
    [4.4971]
    timings: timings.repr.remove(id),
  • edit in src/annotations/timings.rs at line 5
    [4.108][4.0:41](),[4.41][4.32:61]()
    use cargo_metadata::camino::Utf8PathBuf;
    use cargo_metadata::Edition;
  • edit in src/annotations/timings.rs at line 26
    [4.614][4.614:617](),[4.617][4.452:991](),[4.991][4.730:752](),[4.752][4.1009:1160](),[4.1009][4.1009:1160]()
    }
    /// See https://doc.rust-lang.org/nightly/nightly-rustc/cargo/core/manifest/enum.TargetKind.html
    /// and https://doc.rust-lang.org/nightly/nightly-rustc/cargo/core/manifest/enum.TargetKind.html#impl-Serialize-for-TargetKind
    /// This is different to the original enum as `CrateType` has been manually flattened into this enum,
    /// so some information is lost in favour of simplicity
    // TODO: fix this limitation, make `TargetKind` match cargo's definition
    #[derive(Clone, Debug, Serialize, Deserialize)]
    #[serde(rename_all = "kebab-case")]
    pub enum TargetKind {
    Lib,
    Bin,
    Test,
    Bench,
    ExampleLib,
    ExampleBin,
    CustomBuild,
    Rlib,
    Dylib,
    Cdylib,
    Staticlib,
    ProcMacro,
  • edit in src/annotations/timings.rs at line 28
    [4.1163][4.1163:1311](),[4.1311][4.753:945](),[4.945][4.1471:1474](),[4.1471][4.1471:1474]()
    /// See https://doc.rust-lang.org/nightly/nightly-rustc/cargo/core/manifest/struct.TargetInner.html
    #[derive(Clone, Debug, Serialize, Deserialize)]
    pub struct Target {
    pub kind: Vec<TargetKind>,
    pub name: String,
    pub src_path: Utf8PathBuf,
    pub edition: Edition,
    pub doc: bool,
    pub doctest: bool,
    pub test: bool,
    }
  • replacement in src/annotations/timings.rs at line 35
    [4.1015][4.1015:1039]()
    pub target: Target,
    [4.1015]
    [4.1039]
    pub target: super::Target,
  • replacement in src/annotations/self_profile.rs at line 67
    [3.2061][3.2061:2115]()
    pub crate_types: Vec<super::timings::TargetKind>,
    [3.2061]
    [3.2115]
    pub crate_types: Vec<super::TargetKind>,
  • file addition: mod.rs (----------)
    [4.3345]
    use camino::Utf8PathBuf;
    use cargo_metadata::Edition;
    use serde::{Deserialize, Serialize};
    pub mod self_profile;
    pub mod timings;
    /// See https://docs.rs/cargo/latest/cargo/core/compiler/enum.CompileMode.html
    /// These are the only two cases we are interested in
    #[derive(Clone, Debug, Serialize, Deserialize)]
    #[serde(rename_all = "kebab-case")]
    pub enum Mode {
    Build,
    RunCustomBuild,
    }
    /// See https://doc.rust-lang.org/nightly/nightly-rustc/cargo/core/manifest/enum.TargetKind.html
    /// and https://doc.rust-lang.org/nightly/nightly-rustc/cargo/core/manifest/enum.TargetKind.html#impl-Serialize-for-TargetKind
    /// This is different to the original enum as `CrateType` has been manually flattened into this enum,
    /// so some information is lost in favour of simplicity
    // TODO: fix this limitation, make `TargetKind` match cargo's definition
    #[derive(Clone, Debug, Serialize, Deserialize)]
    #[serde(rename_all = "kebab-case")]
    pub enum TargetKind {
    Lib,
    Bin,
    Test,
    Bench,
    ExampleLib,
    ExampleBin,
    CustomBuild,
    Rlib,
    Dylib,
    Cdylib,
    Staticlib,
    ProcMacro,
    }
    /// See https://doc.rust-lang.org/nightly/nightly-rustc/cargo/core/manifest/struct.TargetInner.html
    #[derive(Clone, Debug, Serialize, Deserialize)]
    pub struct Target {
    pub kind: Vec<TargetKind>,
    pub name: String,
    pub src_path: Utf8PathBuf,
    pub edition: Edition,
    pub doc: bool,
    pub doctest: bool,
    pub test: bool,
    }