Add support for stability attributes: #[deprecated], #[experimental], etc.#8921
Add support for stability attributes: #[deprecated], #[experimental], etc.#8921huonw wants to merge 1 commit intorust-lang:masterfrom
Conversation
There are 6 new compiler recognised attributes: deprecated, experimental,
unstable, stable, frozen, locked (these levels are taken directly from
Node's "stability index"[1]). These indicate the stability of the
item to which they are attached; e.g. `#[deprecated] fn foo() { .. }`
says that `foo` is deprecated.
This comes with 3 lints for the first 3 levels (with matching names) that
will detect the use of items marked with them (the `unstable` lint
includes items with no stability attribute). The attributes can be given
a short text note that will be displayed by the lint. An example:
#[warn(unstable)]; // `allow` by default
#[deprecated="use `bar`"]
fn foo() { }
#[stable]
fn bar() { }
fn baz() { }
fn main() {
foo(); // "warning: use of deprecated item: use `bar`"
bar(); // all fine
baz(); // "warning: use of unmarked item"
}
The lints currently only check the "edges" of the AST: i.e. functions,
methods[2], structs and enum variants. Any stability attributes on modules,
enums, traits and impls are not checked.
[1]: http://nodejs.org/api/documentation.html
[2]: the method check is currently incorrect and doesn't work.
|
There's one major problem: I can't get the attributes attached to a method from the point that it is called. i.e. struct Foo;
impl Foo {
#[deprecated]
fn method(&self) {}
}
fn main() {
Foo.method(); // how to I retrieve the `deprecated` attribute above?
}The information isn't in the |
|
1000 kudos! |
|
Looks like method_map is the way to get that info, so I guess it needs to be given to the lint passes. |
|
I think this is a crucial feature for stabilizing the language. Some considerations
|
|
I suspect the term 'unmarked' is a bit unclear here. Maybe also call it unstable but with some additional note that the item isn't annotated. |
Significant progress on #6875, enough that I'll open new bugs and turn that into a metabug when this lands. Description & example in the commit message.
I was thinking that #[stable]
pub mod vec {
pub fn from_elem() { }
#[unstable] pub fn from_fn() { }
}would mean that
It currently marks
They get marked too; it's not entirely obvious to me how to fix this.
Agreed. |
|
If you inherit stability like that, we are going to accidentally stabilize a lot of functions without the necessary discussion. |
|
Hm; it's not necessary to inherit: the only way to actually access those functions will go though the module: i.e. if a crate has a stability annotation then the |
Add `Operators` lint pass changelog: None
Significant progress on #6875, enough that I'll open new bugs and turn that into a metabug when this lands.
Description & example in the commit message.