Fix stack overflow during Registry::create_type for recursive type while running Schema::build. #474
This commit is contained in:
parent
bcfc9b9dd9
commit
36c7d4a883
|
@ -372,30 +372,11 @@ impl Registry {
|
||||||
T::qualified_type_name()
|
T::qualified_type_name()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn create_dummy_type<T: crate::Type>(&mut self) -> MetaType {
|
pub fn create_dummy_type<T: Type>(&mut self) -> MetaType {
|
||||||
let mut dummy_registry = Registry::default();
|
T::create_type_info(self);
|
||||||
T::create_type_info(&mut dummy_registry);
|
self.types
|
||||||
if let Some(ty) = dummy_registry.types.remove(&*T::type_name()) {
|
.remove(&*T::type_name())
|
||||||
// Do not overwrite existing types.
|
.expect("You definitely encountered a bug!")
|
||||||
for (name, ty) in dummy_registry.types {
|
|
||||||
if !self.types.contains_key(&name) {
|
|
||||||
self.types.insert(name, ty);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Do not overwrite existing implements.
|
|
||||||
for (name, interfaces) in dummy_registry.implements {
|
|
||||||
if let Some(current_interfaces) = self.implements.get_mut(&name) {
|
|
||||||
current_interfaces.extend(interfaces);
|
|
||||||
} else {
|
|
||||||
self.implements.insert(name, interfaces);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ty
|
|
||||||
} else {
|
|
||||||
unreachable!()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn add_directive(&mut self, directive: MetaDirective) {
|
pub fn add_directive(&mut self, directive: MetaDirective) {
|
||||||
|
|
|
@ -43,7 +43,7 @@ impl Registry {
|
||||||
}
|
}
|
||||||
write!(
|
write!(
|
||||||
output,
|
output,
|
||||||
"{}: {}",
|
"${}: {}",
|
||||||
variable_definition.node.name.node,
|
variable_definition.node.name.node,
|
||||||
variable_definition.node.var_type.node
|
variable_definition.node.var_type.node
|
||||||
)?;
|
)?;
|
||||||
|
@ -259,7 +259,7 @@ mod tests {
|
||||||
&doc
|
&doc
|
||||||
)
|
)
|
||||||
.unwrap(),
|
.unwrap(),
|
||||||
r#"query Abc { value(input: 10) }"#
|
r#"query Abc($a: Int) { value(input: 10) }"#
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user