On Jul 13, 2013, at 7:27 AM, Michael Woerister wrote:
> Hi everyone,
> I want to help clean up the Rust codebase and one thing I stumbled across a
> few times in the last weeks is the 'spanned' generic struct from
> libsyntax::codemap:
>
> pub struct spanned<T> { node: T, span: span }
>
> It is used quite often to conveniently add a span field to types in
> libsyntax::ast following a common pattern:
>
> pub type crate = spanned<crate_>;
>
> #[deriving(Eq, Encodable, Decodable)]
> pub struct crate_ {
> module: _mod,
> attrs: ~[attribute],
> config: crate_cfg,
> }
>
> This may be convenient for the creator of these types---for the user,
> however, it often adds a bit of cumbersome indirection because the fields of
> the type have to be accessed like this: "crate.node.attrs" when it would be
> more intuitive to just write "crate.attrs". One can work around this of
> course, but especially for newcomers this setup can be a little confusing.
>
> So, I thought it might be a good idea if I tried to remove the spanned<T>
> struct altogether and added the span field directly to the types that are
> wrapped at the moment. If needed, I would also add a Spanned trait that
> allows to abstract over anything having a span.
> Because this would affect quite a bit of the codebase (albeit not
> semantically) I thought, I'd better ask beforehand if you people think this
> is a good idea. Or maybe I am missing a reason for keeping the spanned<T>
> struct around?
I don't want to put words in peoples' mouths, but I think I've heard people
suggesting that we just use a side table for this. Do we have tables with
weakly held keys?
John
_______________________________________________
Rust-dev mailing list
[email protected]
https://mail.mozilla.org/listinfo/rust-dev