Skip to content

Commit 90a402f

Browse files
committed
nest interface item uses UsePath
1 parent c9ee248 commit 90a402f

File tree

2 files changed

+66
-129
lines changed

2 files changed

+66
-129
lines changed

crates/wit-parser/src/ast.rs

Lines changed: 12 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,9 @@ impl<'a> DeclList<'a> {
207207
Some(&u.names),
208208
WorldOrInterface::Interface,
209209
)?,
210+
InterfaceItem::Nest(n) => {
211+
f(Some(&i.name), &n.from, None, WorldOrInterface::Interface)?
212+
}
210213
_ => {}
211214
}
212215
}
@@ -220,19 +223,6 @@ impl<'a> DeclList<'a> {
220223
}
221224
Ok(())
222225
}
223-
224-
fn for_each_nest<'b>(&'b self, mut f: impl FnMut(&'b Nest<'a>) -> Result<()>) -> Result<()> {
225-
for item in self.items.iter() {
226-
if let AstItem::Interface(i) = item {
227-
for item in i.items.iter() {
228-
if let InterfaceItem::Nest(n) = item {
229-
f(n)?;
230-
}
231-
}
232-
}
233-
}
234-
Ok(())
235-
}
236226
}
237227

238228
enum AstItem<'a> {
@@ -563,43 +553,8 @@ enum InterfaceItem<'a> {
563553

564554
struct Nest<'a> {
565555
docs: Docs<'a>,
566-
id: PackageName<'a>,
567-
name: Id<'a>,
568556
attributes: Vec<Attribute<'a>>,
569-
}
570-
571-
impl<'a> Nest<'a> {
572-
fn parse(
573-
tokens: &mut Tokenizer<'a>,
574-
docs: Docs<'a>,
575-
attributes: Vec<Attribute<'a>>,
576-
) -> Result<Self> {
577-
tokens.eat(Token::Nest)?;
578-
let id = parse_id(tokens)?;
579-
tokens.expect(Token::Colon)?;
580-
// `foo:bar/[email protected]`
581-
let namespace = id;
582-
let pkg_name = parse_id(tokens)?;
583-
tokens.expect(Token::Slash)?;
584-
let name = parse_id(tokens)?;
585-
let version = parse_opt_version(tokens)?;
586-
tokens.expect_semicolon()?;
587-
Ok(Self {
588-
id: PackageName {
589-
docs: Default::default(),
590-
span: Span {
591-
start: namespace.span.start,
592-
end: pkg_name.span.end,
593-
},
594-
namespace,
595-
name: pkg_name,
596-
version,
597-
},
598-
docs,
599-
name,
600-
attributes,
601-
})
602-
}
557+
from: UsePath<'a>,
603558
}
604559

605560
struct Use<'a> {
@@ -1039,7 +994,14 @@ impl<'a> InterfaceItem<'a> {
1039994
}
1040995
Some((_span, Token::Use)) => Use::parse(tokens, attributes).map(InterfaceItem::Use),
1041996
Some((_span, Token::Nest)) => {
1042-
Nest::parse(tokens, docs, attributes).map(InterfaceItem::Nest)
997+
tokens.eat(Token::Nest)?;
998+
let path = UsePath::parse(tokens)?;
999+
tokens.expect_semicolon()?;
1000+
Ok(InterfaceItem::Nest(Nest {
1001+
docs,
1002+
attributes,
1003+
from: path,
1004+
}))
10431005
}
10441006
other => Err(err_expected(tokens, "`type`, `resource` or `func`", other).into()),
10451007
}

crates/wit-parser/src/ast/resolve.rs

Lines changed: 54 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
use super::{Nest, ParamList, ResultList, WorldOrInterface};
1+
use super::{ParamList, ResultList, WorldOrInterface};
22
use crate::ast::toposort::toposort;
3-
use crate::ast::InterfaceItem;
3+
use crate::ast::{InterfaceItem, UsePath};
44
use crate::*;
55
use anyhow::bail;
66
use std::collections::{HashMap, HashSet};
@@ -176,8 +176,12 @@ impl<'a> Resolver<'a> {
176176
match item {
177177
ast::AstItem::Interface(iface) => {
178178
for item in &iface.items {
179-
if let InterfaceItem::Nest(n) = item {
180-
let id = match self.ast_items[i][n.name.name] {
179+
if let InterfaceItem::Nest(ast::Nest {
180+
from: UsePath::Package { id, name },
181+
..
182+
}) = item
183+
{
184+
let id = match self.ast_items[i][name.name] {
181185
AstItem::Interface(id) => id,
182186
AstItem::World(_) => unreachable!(),
183187
};
@@ -302,30 +306,6 @@ impl<'a> Resolver<'a> {
302306
Ok(())
303307
})
304308
.unwrap();
305-
decl_list
306-
.for_each_nest(|nest: &Nest| {
307-
let deps = foreign_deps
308-
.entry(nest.id.package_name())
309-
.or_insert_with(|| {
310-
self.foreign_dep_spans.push(nest.id.span);
311-
IndexMap::new()
312-
});
313-
let id = *deps.entry(nest.name.name).or_insert_with(|| {
314-
log::trace!(
315-
"creating an interface for foreign dep: {}/{}",
316-
nest.id.package_name(),
317-
nest.name.name
318-
);
319-
320-
AstItem::Interface(self.alloc_interface(nest.name.span))
321-
});
322-
match id {
323-
AstItem::Interface(id) => foreign_interfaces.insert(id),
324-
AstItem::World(_) => unreachable!(),
325-
};
326-
Ok(())
327-
})
328-
.unwrap();
329309
}
330310
self.foreign_deps = foreign_deps;
331311
self.foreign_interfaces = foreign_interfaces;
@@ -400,16 +380,20 @@ impl<'a> Resolver<'a> {
400380
let prev = names.insert(i.name.name, item);
401381
assert!(prev.is_none());
402382
for nest_item in i.items.iter() {
403-
if let InterfaceItem::Nest(n) = nest_item {
404-
if package_items.insert(n.name.name, n.name.span).is_some() {
383+
if let InterfaceItem::Nest(ast::Nest {
384+
from: UsePath::Package { id, name },
385+
..
386+
}) = nest_item
387+
{
388+
if package_items.insert(name.name, name.span).is_some() {
405389
bail!(Error::new(
406-
n.name.span,
407-
format!("duplicate item named `{}`", n.name.name),
390+
name.span,
391+
format!("duplicate item named `{}`", name.name),
408392
))
409393
}
410-
let prev = decl_list_ns.insert(n.name.name, ());
394+
let prev = decl_list_ns.insert(name.name, ());
411395
assert!(prev.is_none());
412-
let prev = order.insert(n.name.name, Vec::new());
396+
let prev = order.insert(name.name, Vec::new());
413397
assert!(prev.is_none());
414398
}
415399
}
@@ -507,27 +491,6 @@ impl<'a> Resolver<'a> {
507491
}
508492
Ok(())
509493
})?;
510-
decl_list.for_each_nest(|nest: &Nest| {
511-
match decl_list_ns.get(nest.name.name) {
512-
Some((_, ItemSource::Foreign)) => return Ok(()),
513-
Some((_, ItemSource::Local(id))) => {
514-
order[nest.name.name].push(id.clone());
515-
}
516-
None => match package_items.get(nest.name.name) {
517-
Some(_) => {}
518-
None => {
519-
bail!(Error::new(
520-
nest.name.span,
521-
format!(
522-
"interface or world `{name}` not found in package",
523-
name = nest.name.name
524-
),
525-
))
526-
}
527-
},
528-
}
529-
Ok(())
530-
})?;
531494
}
532495

533496
let order = toposort("interface or world", &order)?;
@@ -545,51 +508,60 @@ impl<'a> Resolver<'a> {
545508
let id = self.alloc_interface(package_items[name]);
546509
self.interfaces[id].name = Some(name.to_string());
547510
for item in &i.items {
548-
if let InterfaceItem::Nest(n) = item {
511+
if let InterfaceItem::Nest(ast::Nest {
512+
from:
513+
UsePath::Package {
514+
id: package_id,
515+
name,
516+
},
517+
attributes,
518+
docs,
519+
}) = item
520+
{
549521
let nest = self
550522
.foreign_deps
551523
.get(&PackageName {
552-
namespace: n.id.namespace.name.to_string(),
553-
name: n.id.name.name.to_string(),
554-
version: n.id.clone().version.map(|v| v.1),
524+
namespace: package_id.namespace.name.to_string(),
525+
name: package_id.name.name.to_string(),
526+
version: package_id.clone().version.map(|v| v.1),
555527
})
556528
.unwrap()
557-
.get(&n.name.name)
529+
.get(&name.name)
558530
.unwrap();
559531
let nested_id = if let AstItem::Interface(id) = nest {
560532
id
561533
} else {
562534
bail!("Expected interface item")
563535
};
564-
let stability = self.stability(&n.attributes)?;
565-
let docs = self.docs(&n.docs);
566-
let name = if let Some(v) = &n.id.version {
536+
let stability = self.stability(attributes)?;
537+
let docs = self.docs(&docs);
538+
let full_name = if let Some(v) = &package_id.version {
567539
format!(
568540
"{}:{}/{}@{}",
569-
n.id.namespace.name,
570-
n.id.name.name,
571-
n.name.name,
541+
package_id.namespace.name,
542+
package_id.name.name,
543+
name.name,
572544
v.1.to_string()
573545
)
574546
} else {
575-
format!("{}/{}", n.id.package_name(), n.name.name)
547+
format!("{}/{}", package_id.package_name(), name.name)
576548
};
549+
577550
self.interfaces[id].nested.insert(
578-
// format!("{}/{}", n.id.package_name(), n.name.name.to_string()),
579-
name,
551+
full_name.clone(),
580552
crate::Nest {
581553
id: *nested_id,
582554
docs,
583555
stability,
584556
package_name: PackageName {
585-
namespace: n.id.namespace.name.to_string(),
586-
name: n.id.name.name.to_string(),
587-
version: n.id.version.as_ref().map(|v| v.1.clone()),
557+
namespace: package_id.namespace.name.to_string(),
558+
name: package_id.name.name.to_string(),
559+
version: package_id.version.as_ref().map(|v| v.1.clone()),
588560
},
589-
iface_name: n.name.name.to_string(),
561+
iface_name: name.name.to_string(),
590562
},
591563
);
592-
let prev = ids.insert(n.name.name, AstItem::Interface(id));
564+
let prev = ids.insert(name.name, AstItem::Interface(id));
593565
assert!(prev.is_none());
594566
}
595567
}
@@ -638,11 +610,15 @@ impl<'a> Resolver<'a> {
638610
}
639611
ast::AstItem::Interface(i) => {
640612
for item in &i.items {
641-
if let InterfaceItem::Nest(n) = item {
642-
let iface_item = ids[n.name.name];
643-
let prev = items.insert(n.name.name, iface_item);
613+
if let InterfaceItem::Nest(ast::Nest {
614+
from: UsePath::Package { name, .. },
615+
..
616+
}) = item
617+
{
618+
let iface_item = ids[name.name];
619+
let prev = items.insert(name.name, iface_item);
644620
assert!(prev.is_none());
645-
let prev = self.package_items.insert(n.name.name, iface_item);
621+
let prev = self.package_items.insert(name.name, iface_item);
646622
assert!(prev.is_none());
647623
}
648624
}
@@ -716,7 +692,6 @@ impl<'a> Resolver<'a> {
716692

717693
Ok(())
718694
})?;
719-
decl_list.for_each_nest(|_nest| Ok(()))?;
720695
}
721696
Ok(())
722697
}

0 commit comments

Comments
 (0)