device-driver-mir 2.0.0

Internal compiler crate for the device-driver toolkit
Documentation
use std::collections::HashSet;

use crate::{
    model::{Manifest, Unique, UniqueId},
    passes::{Assumption, Pass},
};
use device_driver_diagnostics::{Diagnostics, DynError, errors::ZeroStrideRepeat};

pub struct RepeatZeroStrideRejected;

impl Pass for RepeatZeroStrideRejected {
    const ASSUMPTIONS_MADE: &[Assumption] = &[];
    const ASSUMPTIONS_RELEASED: &[Assumption] = &[Assumption::RepeatStrideNonZero];

    fn run_pass(
        manifest: &mut Manifest,
        diagnostics: &mut Diagnostics,
    ) -> Result<HashSet<UniqueId>, DynError> {
        let mut removals = HashSet::new();

        for object in manifest.iter_objects() {
            let Some(repeat) = object.repeat() else {
                continue;
            };

            if repeat.stride == 0 {
                diagnostics.add(ZeroStrideRepeat {
                    stride: repeat.stride.span,
                });
                removals.insert(object.id());
            }
        }

        Ok(removals)
    }
}