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() 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) {

View File

@ -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) }"#
); );
} }