ApiDependencyGraph

Struct ApiDependencyGraph 

Source
pub struct ApiDependencyGraph<'tcx> {
    graph: Graph<DepNode<'tcx>, DepEdge>,
    node_indices: HashMap<DepNode<'tcx>, NodeIndex>,
    ty_nodes: Vec<NodeIndex>,
    api_nodes: Vec<NodeIndex>,
    tcx: TyCtxt<'tcx>,
}

Fields§

§graph: Graph<DepNode<'tcx>, DepEdge>§node_indices: HashMap<DepNode<'tcx>, NodeIndex>§ty_nodes: Vec<NodeIndex>§api_nodes: Vec<NodeIndex>§tcx: TyCtxt<'tcx>

Implementations§

Source§

impl<'tcx> ApiDependencyGraph<'tcx>

Source

pub fn eligible_nodes_with(&self, tys: &[Ty<'tcx>]) -> Vec<DepNode<'tcx>>

Source

pub fn eligible_transforms_to( &self, ty: Ty<'tcx>, ) -> Vec<(TyWrapper<'tcx>, TransformKind)>

Source§

impl<'tcx> ApiDependencyGraph<'tcx>

Source

pub fn dump_to_file(&self, path: impl AsRef<Path>) -> Result<()>

Source§

impl<'tcx> ApiDependencyGraph<'tcx>

Source

pub fn dump_to_dot(&self) -> String

Source§

impl<'tcx> ApiDependencyGraph<'tcx>

Source

pub fn resolve_generic_api( &mut self, non_generic_apis: &[DefId], generic_apis: &[DefId], max_iteration: usize, )

Source

pub fn search_reachable_apis( &mut self, non_generic_apis: &[DefId], generic_apis: &[DefId], max_iteration: usize, ) -> HashMap<DefId, HashSet<Mono<'tcx>>>

Source

pub fn add_mono_apis_from_map( &mut self, generic_map: &HashMap<DefId, HashSet<Mono<'tcx>>>, )

Source

pub fn heuristic_select(&mut self, reserved: &mut [bool])

heuristic strategy: prioritize to reserve APIs that first arg of which is reachable. This is based on that we want to reserve APIs that have the same Self type ASAP.

Source

pub fn minimal_select( &mut self, reserved: &mut [bool], generic_map: &HashMap<DefId, HashSet<Mono<'tcx>>>, )

Source

pub fn prune_by_similarity( &mut self, generic_map: HashMap<DefId, HashSet<Mono<'tcx>>>, ) -> Vec<bool>

Source

pub fn reserve_nodes(&mut self, reserved: &[bool]) -> usize

Source

pub fn propagate_reserved( &self, node: NodeIndex, visited: &mut [bool], reserved: &mut [bool], ) -> bool

Source§

impl<'tcx> ApiDependencyGraph<'tcx>

Source

pub fn update_transform_edges(&mut self)

Source

fn add_possible_transform<const MAX_DEPTH: usize>( &mut self, current_ty: TyWrapper<'tcx>, depth: usize, ) -> Option<NodeIndex>

Source§

impl<'tcx> ApiDependencyGraph<'tcx>

Source

pub fn new(tcx: TyCtxt<'tcx>) -> ApiDependencyGraph<'tcx>

Source

pub fn num_api(&self) -> usize

Source

pub fn num_ty(&self) -> usize

Source

pub fn api_node_at(&self, idx: usize) -> DepNode<'tcx>

Source

fn tcx(&self) -> TyCtxt<'tcx>

Source

pub fn build(&mut self, config: &Config)

Source

pub fn inner_graph(&self) -> &Graph<DepNode<'tcx>, DepEdge>

Source

pub fn statistics(&self) -> Statistics

Source

pub fn is_node_exist(&self, node: &DepNode<'tcx>) -> bool

Source

pub fn get_or_create_index(&mut self, node: DepNode<'tcx>) -> NodeIndex

Source

pub fn get_node_from_index(&self, index: NodeIndex) -> DepNode<'tcx>

Source

pub fn get_index_by_ty(&self, ty: Ty<'tcx>) -> Option<NodeIndex>

Source

pub fn get_index(&self, node: DepNode<'tcx>) -> Option<NodeIndex>

Source

pub fn add_edge(&mut self, src: NodeIndex, dst: NodeIndex, edge: DepEdge)

Source

pub fn add_edge_once(&mut self, src: NodeIndex, dst: NodeIndex, edge: DepEdge)

Source

pub fn add_identity_api(&mut self, fn_did: DefId) -> bool

Source

pub fn add_api(&mut self, fn_did: DefId, args: &[GenericArg<'tcx>]) -> bool

return true if the api is added successfully, false if it already exists.

Source

pub fn all_transforms(&self, ty: Ty<'tcx>) -> Vec<TransformKind>

return all transform kind for ty that we intersted in.

Source

pub fn is_start_node_index(&self, index: NodeIndex) -> bool

Source

pub fn depth_map(&self) -> HashMap<DepNode<'tcx>, usize>

Source

pub fn traverse_covered_api_with( &self, f_cover: &mut impl FnMut(DefId), f_total: &mut impl FnMut(DefId), )

Source

fn recache(&mut self)

Source

pub fn uncovered_api(&self) -> Vec<DefId>

Source

pub fn estimate_coverage(&self) -> (usize, usize)

estimate_coverage treat each API as the distinct API. For example, if foo<T>, foo<U> are covered, this API return (2, 2).

Source

pub fn estimate_coverage_distinct(&self) -> (usize, usize)

estimate_coverage_distinct treat mono API as the original generic API. For example, if foo<T>, foo<U> are covered, this API return (1, 1).

Source

pub fn dump_apis<P: AsRef<Path>>(&self, path: P)

Trait Implementations§

Source§

impl<'tcx> Clone for ApiDependencyGraph<'tcx>

Source§

fn clone(&self) -> ApiDependencyGraph<'tcx>

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl<'tcx> Serialize for ApiDependencyGraph<'tcx>

Source§

fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where S: Serializer,

Serialize this value into the given Serde serializer. Read more

Auto Trait Implementations§

§

impl<'tcx> Freeze for ApiDependencyGraph<'tcx>

§

impl<'tcx> !RefUnwindSafe for ApiDependencyGraph<'tcx>

§

impl<'tcx> !Send for ApiDependencyGraph<'tcx>

§

impl<'tcx> !Sync for ApiDependencyGraph<'tcx>

§

impl<'tcx> Unpin for ApiDependencyGraph<'tcx>

§

impl<'tcx> !UnwindSafe for ApiDependencyGraph<'tcx>

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V