Skip to content

Commit b70cc53

Browse files
committed
Add easy edition feature flag
1 parent c08480f commit b70cc53

File tree

2 files changed

+30
-13
lines changed

2 files changed

+30
-13
lines changed

src/libsyntax/edition.rs

+7
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,13 @@ impl Edition {
5555
Edition::Edition2018 => "edition_2018",
5656
}
5757
}
58+
59+
pub fn feature_name(&self) -> &'static str {
60+
match *self {
61+
Edition::Edition2015 => "rust_2015_preview",
62+
Edition::Edition2018 => "rust_2018_preview",
63+
}
64+
}
5865
}
5966

6067
impl FromStr for Edition {

src/libsyntax/feature_gate.rs

+23-13
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ use self::AttributeGate::*;
2828
use abi::Abi;
2929
use ast::{self, NodeId, PatKind, RangeEnd};
3030
use attr;
31-
use edition::Edition;
31+
use edition::{ALL_EDITIONS, Edition};
3232
use codemap::Spanned;
3333
use syntax_pos::{Span, DUMMY_SP};
3434
use errors::{DiagnosticBuilder, Handler, FatalError};
@@ -1818,21 +1818,15 @@ impl<'a> Visitor<'a> for PostExpansionVisitor<'a> {
18181818
}
18191819

18201820
pub fn get_features(span_handler: &Handler, krate_attrs: &[ast::Attribute],
1821-
edition: Edition) -> Features {
1821+
crate_edition: Edition) -> Features {
1822+
fn feature_removed(span_handler: &Handler, span: Span) {
1823+
span_err!(span_handler, span, E0557, "feature has been removed");
1824+
}
1825+
18221826
let mut features = Features::new();
18231827

18241828
let mut feature_checker = FeatureChecker::default();
18251829

1826-
for &(.., f_edition, set) in ACTIVE_FEATURES.iter() {
1827-
if let Some(f_edition) = f_edition {
1828-
if edition >= f_edition {
1829-
// FIXME(Manishearth) there is currently no way to set
1830-
// lang features by edition
1831-
set(&mut features, DUMMY_SP);
1832-
}
1833-
}
1834-
}
1835-
18361830
for attr in krate_attrs {
18371831
if !attr.check_name("feature") {
18381832
continue
@@ -1845,6 +1839,7 @@ pub fn get_features(span_handler: &Handler, krate_attrs: &[ast::Attribute],
18451839
}
18461840
Some(list) => {
18471841
for mi in list {
1842+
18481843
let name = if let Some(word) = mi.word() {
18491844
word.name()
18501845
} else {
@@ -1862,11 +1857,26 @@ pub fn get_features(span_handler: &Handler, krate_attrs: &[ast::Attribute],
18621857
.find(|& &(n, _, _)| name == n)
18631858
.or_else(|| STABLE_REMOVED_FEATURES.iter()
18641859
.find(|& &(n, _, _)| name == n)) {
1865-
span_err!(span_handler, mi.span, E0557, "feature has been removed");
1860+
feature_removed(span_handler, mi.span);
18661861
}
18671862
else if let Some(&(_, _, _)) = ACCEPTED_FEATURES.iter()
18681863
.find(|& &(n, _, _)| name == n) {
18691864
features.declared_stable_lang_features.push((name, mi.span));
1865+
} else if let Some(&edition) = ALL_EDITIONS.iter()
1866+
.find(|e| name == e.feature_name()) {
1867+
if edition <= crate_edition {
1868+
feature_removed(span_handler, mi.span);
1869+
} else {
1870+
for &(.., f_edition, set) in ACTIVE_FEATURES.iter() {
1871+
if let Some(f_edition) = f_edition {
1872+
if edition >= f_edition {
1873+
// FIXME(Manishearth) there is currently no way to set
1874+
// lib features by edition
1875+
set(&mut features, DUMMY_SP);
1876+
}
1877+
}
1878+
}
1879+
}
18701880
} else {
18711881
features.declared_lib_features.push((name, mi.span));
18721882
}

0 commit comments

Comments
 (0)