Handle external types wrt has_embedded

This commit is contained in:
Tony Garnock-Jones 2021-09-15 10:50:37 +02:00
parent 352d8ba1b3
commit 985a0b6795
2 changed files with 12 additions and 5 deletions

View File

@ -73,8 +73,8 @@ impl<'b> BundleContext<'b> {
}
}
pub fn type_for_name(&self, r: &Ref) -> &types::TDefinition {
self.types.get(r).unwrap_or_else(|| panic!("{:?} not found", r))
pub fn type_for_name(&self, r: &Ref) -> Option<&types::TDefinition> {
self.types.get(r)
}
pub fn define_literal(&mut self, v: &IOValue) -> String {
@ -153,7 +153,7 @@ impl<'m, 'b> ModuleContext<'m, 'b> {
Some(s) =>
item(name![s.to_owned(), r.name.to_owned()])
};
if with_generic_args && self.type_for_name(r).has_embedded(self) {
if with_generic_args && self.ref_has_embedded(r) {
item(seq![base, anglebrackets!["_Any"]])
} else {
base
@ -172,10 +172,17 @@ impl<'m, 'b> ModuleContext<'m, 'b> {
}
}
pub fn type_for_name(&self, r: &Ref) -> &types::TDefinition {
pub fn type_for_name(&self, r: &Ref) -> Option<&types::TDefinition> {
self.bundle.type_for_name(&self.qualify(r))
}
pub fn ref_has_embedded(&self, r: &Ref) -> bool {
match self.type_for_name(r) {
Some(ty) => ty.has_embedded(self),
None => false, // TODO: should this be configurable?
}
}
pub fn literals_generic_decls(&self) -> Item {
item(anglebrackets!["_Any: preserves::value::NestedValue"])
}

View File

@ -214,7 +214,7 @@ impl TField {
false
} else {
seen.insert(r.clone());
ctxt.type_for_name(&r)._has_embedded(ctxt, seen)
ctxt.type_for_name(&r).map(|ty| ty._has_embedded(ctxt, seen)).unwrap_or(false)
}
}
TField::Base(_) => false,