Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions crates/wit-component/src/encoding.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2932,6 +2932,7 @@ impl<'a> Shims<'a> {
result: wit_result,
docs: Default::default(),
stability: Stability::Unknown,
span: None,
},
if async_ {
AbiVariant::GuestImportAsync
Expand Down Expand Up @@ -3029,6 +3030,7 @@ fn task_return_options_and_type(
result: None,
docs: Default::default(),
stability: Stability::Unknown,
span: None,
};
let abi = AbiVariant::GuestImport;
let options = RequiredOptions::for_import(resolve, &func_tmp, abi);
Expand Down
1 change: 1 addition & 0 deletions crates/wit-component/src/metadata.rs
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,7 @@ impl Default for Bindgen {
include_names: Default::default(),
package: Some(package),
stability: Default::default(),
span: None,
});
resolve.packages[package]
.worlds
Expand Down
11 changes: 11 additions & 0 deletions crates/wit-dylib/tests/roundtrip.rs
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,7 @@ fn run_one(u: &mut Unstructured<'_>) -> Result<()> {
result: Some(Type::U32),
stability: Default::default(),
docs: Default::default(),
span: None,
},
);
funcs.insert(
Expand All @@ -144,6 +145,7 @@ fn run_one(u: &mut Unstructured<'_>) -> Result<()> {
result: None,
stability: Default::default(),
docs: Default::default(),
span: None,
},
);
funcs.insert(
Expand All @@ -155,10 +157,12 @@ fn run_one(u: &mut Unstructured<'_>) -> Result<()> {
result: Some(Type::U32),
stability: Default::default(),
docs: Default::default(),
span: None,
},
);
funcs
},
span: None,
});

// Generate two worlds in our custom package, one for the callee and one for
Expand All @@ -173,6 +177,7 @@ fn run_one(u: &mut Unstructured<'_>) -> Result<()> {
includes: Default::default(),
include_names: Default::default(),
docs: Default::default(),
span: None,
});
let caller = resolve.worlds.alloc(World {
name: "caller".to_string(),
Expand All @@ -183,6 +188,7 @@ fn run_one(u: &mut Unstructured<'_>) -> Result<()> {
includes: Default::default(),
include_names: Default::default(),
docs: Default::default(),
span: None,
});

// Add an extra import/export for our synthesized interfaces as well.
Expand Down Expand Up @@ -214,6 +220,7 @@ fn run_one(u: &mut Unstructured<'_>) -> Result<()> {
result: None,
stability: Default::default(),
docs: Default::default(),
span: None,
}),
);

Expand Down Expand Up @@ -316,13 +323,15 @@ fn update_resources(resolve: &mut Resolve) {
owner: TypeOwner::None,
docs: Default::default(),
stability: Default::default(),
span: None,
});
let borrow = resolve.types.alloc(TypeDef {
name: None,
kind: TypeDefKind::Handle(Handle::Borrow(resource_id)),
owner: TypeOwner::None,
docs: Default::default(),
stability: Default::default(),
span: None,
});
let iface = &mut resolve.interfaces[interface_id];
let ctor = format!("[constructor]{resource_name}");
Expand All @@ -339,6 +348,7 @@ fn update_resources(resolve: &mut Resolve) {
result: Some(Type::Id(own)),
stability: Default::default(),
docs: Default::default(),
span: None,
},
);
iface.functions.insert(
Expand All @@ -350,6 +360,7 @@ fn update_resources(resolve: &mut Resolve) {
result: Some(Type::U32),
stability: Default::default(),
docs: Default::default(),
span: None,
},
);
}
Expand Down
22 changes: 19 additions & 3 deletions crates/wit-parser/src/ast.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1689,13 +1689,13 @@ fn eat_id(tokens: &mut Tokenizer<'_>, expected: &str) -> Result<Span> {
/// [`UnresolvedPackage`].
///
/// [`UnresolvedPackage`]: crate::UnresolvedPackage
#[derive(Clone, Default)]
#[derive(Clone, Default, Debug)]
pub struct SourceMap {
sources: Vec<Source>,
offset: u32,
}

#[derive(Clone)]
#[derive(Clone, Debug)]
struct Source {
offset: u32,
path: String,
Expand Down Expand Up @@ -1754,6 +1754,21 @@ impl SourceMap {
self.offset = new_offset;
}

/// Appends all sources from another `SourceMap` into this one.
///
/// Returns the byte offset that should be added to all `Span.start` and
/// `Span.end` values from the appended source map to make them valid
/// in the combined source map.
pub fn append(&mut self, other: SourceMap) -> u32 {
let base = self.offset;
for mut source in other.sources {
source.offset += base;
self.sources.push(source);
}
self.offset += other.offset;
base
}

/// Parses the files added to this source map into a
/// [`UnresolvedPackageGroup`].
pub fn parse(self) -> Result<UnresolvedPackageGroup> {
Expand Down Expand Up @@ -1900,7 +1915,8 @@ impl SourceMap {
return msg;
}

pub(crate) fn render_location(&self, span: Span) -> String {
/// Renders a span as a human-readable location string (e.g., "file.wit:10:5").
pub fn render_location(&self, span: Span) -> String {
let src = self.source_for_offset(span.start);
let start = src.to_relative_offset(span.start);
let (line, col) = src.linecol(start);
Expand Down
10 changes: 9 additions & 1 deletion crates/wit-parser/src/ast/lex.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,14 +21,22 @@ struct CrlfFold<'a> {
}

/// A span, designating a range of bytes where a token is located.
#[derive(Eq, PartialEq, Debug, Clone, Copy)]
#[derive(Eq, PartialEq, Debug, Clone, Copy, Hash)]
pub struct Span {
/// The start of the range.
pub start: u32,
/// The end of the range (exclusive).
pub end: u32,
}

impl Span {
/// Adjusts this span by adding the given byte offset to both start and end.
pub fn adjust(&mut self, offset: u32) {
self.start += offset;
self.end += offset;
}
}

#[derive(Eq, PartialEq, Debug, Copy, Clone)]
pub enum Token {
Whitespace,
Expand Down
13 changes: 13 additions & 0 deletions crates/wit-parser/src/ast/resolve.rs
Original file line number Diff line number Diff line change
Expand Up @@ -329,6 +329,7 @@ impl<'a> Resolver<'a> {
stability: Default::default(),
functions: IndexMap::default(),
package: None,
span: Some(span),
})
}

Expand All @@ -348,6 +349,7 @@ impl<'a> Resolver<'a> {
includes: Default::default(),
include_names: Default::default(),
stability: Default::default(),
span: Some(span),
})
}

Expand Down Expand Up @@ -599,6 +601,7 @@ impl<'a> Resolver<'a> {
kind: TypeDefKind::Unknown,
name: Some(name.name.name.to_string()),
owner: TypeOwner::Interface(iface),
span: Some(name.name.span),
});
self.unknown_type_spans.push(name.name.span);
self.type_spans.push(name.name.span);
Expand Down Expand Up @@ -951,6 +954,7 @@ impl<'a> Resolver<'a> {
kind,
name: Some(def.name.name.to_string()),
owner,
span: Some(def.name.span),
});
self.type_spans.push(def.name.span);
self.define_interface_name(&def.name, TypeOrItem::Type(id))?;
Expand Down Expand Up @@ -999,13 +1003,15 @@ impl<'a> Resolver<'a> {
)),
};
self.type_spans.push(name.name.span);
let span = name.name.span;
let name = name.as_.as_ref().unwrap_or(&name.name);
let id = self.types.alloc(TypeDef {
docs: Docs::default(),
stability: stability.clone(),
kind: TypeDefKind::Type(Type::Id(id)),
name: Some(name.name.to_string()),
owner,
span: Some(span),
});
self.define_interface_name(name, TypeOrItem::Type(id))?;
}
Expand Down Expand Up @@ -1096,6 +1102,7 @@ impl<'a> Resolver<'a> {
kind,
params,
result,
span: Some(func.span),
})
}

Expand Down Expand Up @@ -1263,6 +1270,7 @@ impl<'a> Resolver<'a> {
docs: self.docs(&field.docs),
name: field.name.name.to_string(),
ty: self.resolve_type(&field.ty, stability)?,
span: Some(field.name.span),
})
})
.collect::<Result<Vec<_>>>()?;
Expand All @@ -1275,6 +1283,7 @@ impl<'a> Resolver<'a> {
.map(|flag| Flag {
docs: self.docs(&flag.docs),
name: flag.name.name.to_string(),
span: Some(flag.name.span),
})
.collect::<Vec<_>>();
TypeDefKind::Flags(Flags { flags })
Expand All @@ -1299,6 +1308,7 @@ impl<'a> Resolver<'a> {
docs: self.docs(&case.docs),
name: case.name.name.to_string(),
ty: self.resolve_optional_type(case.ty.as_ref(), stability)?,
span: Some(case.name.span),
})
})
.collect::<Result<Vec<_>>>()?;
Expand All @@ -1315,6 +1325,7 @@ impl<'a> Resolver<'a> {
Ok(EnumCase {
docs: self.docs(&case.docs),
name: case.name.name.to_string(),
span: Some(case.name.span),
})
})
.collect::<Result<Vec<_>>>()?;
Expand Down Expand Up @@ -1453,6 +1464,7 @@ impl<'a> Resolver<'a> {
docs: Docs::default(),
stability,
owner: TypeOwner::None,
span: Some(ty.span()),
},
ty.span(),
))
Expand Down Expand Up @@ -1654,6 +1666,7 @@ impl<'a> Resolver<'a> {
kind,
name: None,
owner: TypeOwner::None,
span: Some(span),
},
span,
);
Expand Down
11 changes: 11 additions & 0 deletions crates/wit-parser/src/decoding.rs
Original file line number Diff line number Diff line change
Expand Up @@ -311,6 +311,7 @@ impl ComponentInfo {
includes: Default::default(),
include_names: Default::default(),
stability: Default::default(),
span: None,
});
let mut package = Package {
// Similar to `world_name` above this is arbitrarily chosen as it's
Expand Down Expand Up @@ -900,6 +901,7 @@ impl WitPackageDecoder<'_> {
functions: IndexMap::default(),
package: None,
stability: Default::default(),
span: None,
})
});

Expand Down Expand Up @@ -955,6 +957,7 @@ impl WitPackageDecoder<'_> {
functions: IndexMap::default(),
package: None,
stability: Default::default(),
span: None,
};

let owner = TypeOwner::Interface(self.resolve.interfaces.next_id());
Expand Down Expand Up @@ -1051,6 +1054,7 @@ impl WitPackageDecoder<'_> {
docs: Default::default(),
stability: Default::default(),
owner,
span: None,
});

// If this is a resource then doubly-register it in `self.resources` so
Expand Down Expand Up @@ -1088,6 +1092,7 @@ impl WitPackageDecoder<'_> {
include_names: Default::default(),
package: None,
stability: Default::default(),
span: None,
};

let owner = TypeOwner::World(self.resolve.worlds.next_id());
Expand Down Expand Up @@ -1238,6 +1243,7 @@ impl WitPackageDecoder<'_> {
name: name.to_string(),
params,
result,
span: None,
})
}

Expand Down Expand Up @@ -1287,6 +1293,7 @@ impl WitPackageDecoder<'_> {
stability: Default::default(),
owner: TypeOwner::None,
kind,
span: None,
});
let prev = self.type_map.insert(id.into(), ty);
assert!(prev.is_none());
Expand Down Expand Up @@ -1353,6 +1360,7 @@ impl WitPackageDecoder<'_> {
format!("failed to convert record field '{name}'")
})?,
docs: Default::default(),
span: None,
})
})
.collect::<Result<_>>()?;
Expand All @@ -1371,6 +1379,7 @@ impl WitPackageDecoder<'_> {
None => None,
},
docs: Default::default(),
span: None,
})
})
.collect::<Result<_>>()?;
Expand All @@ -1383,6 +1392,7 @@ impl WitPackageDecoder<'_> {
.map(|name| Flag {
name: name.to_string(),
docs: Default::default(),
span: None,
})
.collect();
Ok(TypeDefKind::Flags(Flags { flags }))
Expand All @@ -1395,6 +1405,7 @@ impl WitPackageDecoder<'_> {
.map(|name| EnumCase {
name: name.into(),
docs: Default::default(),
span: None,
})
.collect();
Ok(TypeDefKind::Enum(Enum { cases }))
Expand Down
Loading