Fix NoUnusedFragments
validation rule
This commit is contained in:
parent
2b609ee057
commit
c843471d37
1 changed files with 13 additions and 13 deletions
|
@ -7,7 +7,7 @@ use crate::{
|
||||||
value::ScalarValue,
|
value::ScalarValue,
|
||||||
};
|
};
|
||||||
|
|
||||||
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
|
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
|
||||||
pub enum Scope<'a> {
|
pub enum Scope<'a> {
|
||||||
Operation(Option<&'a str>),
|
Operation(Option<&'a str>),
|
||||||
Fragment(&'a str),
|
Fragment(&'a str),
|
||||||
|
@ -28,15 +28,13 @@ pub struct NoUnusedFragments<'a> {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> NoUnusedFragments<'a> {
|
impl<'a> NoUnusedFragments<'a> {
|
||||||
fn find_reachable_fragments(&'a self, from: &Scope<'a>, result: &mut HashSet<&'a str>) {
|
fn find_reachable_fragments(&'a self, from: Scope<'a>, result: &mut HashSet<&'a str>) {
|
||||||
let mut to_visit = Vec::new();
|
let mut to_visit = Vec::new();
|
||||||
if let Scope::Fragment(name) = *from {
|
to_visit.push(from);
|
||||||
to_visit.push(name);
|
|
||||||
}
|
|
||||||
|
|
||||||
while let Some(from) = to_visit.pop() {
|
while let Some(from) = to_visit.pop() {
|
||||||
if let Some(next) = self.find_reachable_fragments_inner(from, result) {
|
if let Some(next) = self.find_reachable_fragments_inner(from, result) {
|
||||||
to_visit.extend(next);
|
to_visit.extend(next.iter().map(|s| Scope::Fragment(s)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -47,16 +45,18 @@ impl<'a> NoUnusedFragments<'a> {
|
||||||
/// [`Vec`] that is visited inside [`Self::find_reachable_fragments()`].
|
/// [`Vec`] that is visited inside [`Self::find_reachable_fragments()`].
|
||||||
fn find_reachable_fragments_inner(
|
fn find_reachable_fragments_inner(
|
||||||
&'a self,
|
&'a self,
|
||||||
from: &'a str,
|
from: Scope<'a>,
|
||||||
result: &mut HashSet<&'a str>,
|
result: &mut HashSet<&'a str>,
|
||||||
) -> Option<&'a Vec<&'a str>> {
|
) -> Option<&'a Vec<&'a str>> {
|
||||||
if result.contains(from) {
|
if let Scope::Fragment(name) = from {
|
||||||
return None;
|
if result.contains(name) {
|
||||||
} else {
|
return None;
|
||||||
result.insert(from);
|
} else {
|
||||||
|
result.insert(name);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
self.spreads.get(&Scope::Fragment(from))
|
self.spreads.get(&from)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -74,7 +74,7 @@ where
|
||||||
}) = *def
|
}) = *def
|
||||||
{
|
{
|
||||||
let op_name = name.as_ref().map(|s| s.item);
|
let op_name = name.as_ref().map(|s| s.item);
|
||||||
self.find_reachable_fragments(&Scope::Operation(op_name), &mut reachable);
|
self.find_reachable_fragments(Scope::Operation(op_name), &mut reachable);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue