Fix stack overflow during Registry::create_type for recursive type while running Schema::build. #474

This commit is contained in:
Sunli 2021-04-08 11:27:06 +08:00
parent bcfc9b9dd9
commit 36c7d4a883
2 changed files with 7 additions and 26 deletions

View File

@ -372,30 +372,11 @@ impl Registry {
T::qualified_type_name()
}
pub fn create_dummy_type<T: crate::Type>(&mut self) -> MetaType {
let mut dummy_registry = Registry::default();
T::create_type_info(&mut dummy_registry);
if let Some(ty) = dummy_registry.types.remove(&*T::type_name()) {
// Do not overwrite existing types.
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 create_dummy_type<T: Type>(&mut self) -> MetaType {
T::create_type_info(self);
self.types
.remove(&*T::type_name())
.expect("You definitely encountered a bug!")
}
pub fn add_directive(&mut self, directive: MetaDirective) {

View File

@ -43,7 +43,7 @@ impl Registry {
}
write!(
output,
"{}: {}",
"${}: {}",
variable_definition.node.name.node,
variable_definition.node.var_type.node
)?;
@ -259,7 +259,7 @@ mod tests {
&doc
)
.unwrap(),
r#"query Abc { value(input: 10) }"#
r#"query Abc($a: Int) { value(input: 10) }"#
);
}