提交 0df9b850 编写于 作者: B bors

auto merge of #10696 : fhahn/rust/issue9543-remove-extern-mod-foo, r=pcwalton

This patch for  #9543 throws an `obsolete syntax` error for `extern mod foo (name="bar")` . 
I was wondering if [this](https://github.com/fhahn/rust/compare/mozilla:master...fhahn:issue9543-remove-extern-mod-foo?expand=1#diff-da9d34ca1d0f6beee2838cf02e07345cR4444) is the correct place to do this?

I think the wording of the error message could probably be improved as well.

If this approach is OK, I'm going to run the whole test suite tomorrow and update the old syntax to the new one.
......@@ -21,7 +21,7 @@
use syntax::opt_vec;
use syntax::util::small_vector::SmallVector;
static STD_VERSION: &'static str = "0.9-pre";
pub static VERSION: &'static str = "0.9-pre";
pub fn maybe_inject_libstd_ref(sess: Session, crate: ast::Crate)
-> ast::Crate {
......@@ -57,12 +57,10 @@ struct StandardLibraryInjector {
impl fold::ast_fold for StandardLibraryInjector {
fn fold_crate(&mut self, crate: ast::Crate) -> ast::Crate {
let version = STD_VERSION.to_managed();
let vers_item = attr::mk_name_value_item_str(@"vers", version);
let mut vis = ~[ast::view_item {
node: ast::view_item_extern_mod(self.sess.ident_of("std"),
None,
~[vers_item.clone()],
Some((format!("std\\#{}", VERSION).to_managed(),
ast::CookedStr)),
ast::DUMMY_NODE_ID),
attrs: ~[],
vis: ast::private,
......@@ -72,8 +70,8 @@ fn fold_crate(&mut self, crate: ast::Crate) -> ast::Crate {
if use_uv(&crate) && !self.sess.building_library.get() {
vis.push(ast::view_item {
node: ast::view_item_extern_mod(self.sess.ident_of("green"),
None,
~[vers_item],
Some((format!("green\\#{}", VERSION).to_managed(),
ast::CookedStr)),
ast::DUMMY_NODE_ID),
attrs: ~[],
vis: ast::private,
......@@ -81,8 +79,8 @@ fn fold_crate(&mut self, crate: ast::Crate) -> ast::Crate {
});
vis.push(ast::view_item {
node: ast::view_item_extern_mod(self.sess.ident_of("rustuv"),
None,
~[vers_item],
Some((format!("rustuv\\#{}", VERSION).to_managed(),
ast::CookedStr)),
ast::DUMMY_NODE_ID),
attrs: ~[],
vis: ast::private,
......
......@@ -13,6 +13,7 @@
use driver::session;
use front::config;
use front::std_inject::VERSION;
use std::cell::RefCell;
use std::vec;
......@@ -291,8 +292,10 @@ fn mk_std(cx: &TestCtxt) -> ast::view_item {
path_node(~[id_extra]),
ast::DUMMY_NODE_ID))])
} else {
let mi = attr::mk_name_value_item_str(@"vers", @"0.9-pre");
ast::view_item_extern_mod(id_extra, None, ~[mi], ast::DUMMY_NODE_ID)
ast::view_item_extern_mod(id_extra,
Some((format!("extra\\#{}", VERSION).to_managed(),
ast::CookedStr)),
ast::DUMMY_NODE_ID)
};
ast::view_item {
node: vi,
......
......@@ -132,7 +132,7 @@ fn visit_crate(e: &Env, c: &ast::Crate) {
fn visit_view_item(e: &mut Env, i: &ast::view_item) {
match i.node {
ast::view_item_extern_mod(ident, path_opt, _, id) => {
ast::view_item_extern_mod(ident, path_opt, id) => {
let ident = token::ident_to_str(&ident);
debug!("resolving extern mod stmt. ident: {:?} path_opt: {:?}",
ident, path_opt);
......
......@@ -1507,7 +1507,7 @@ fn build_reduced_graph_for_view_item(&mut self,
}
}
view_item_extern_mod(name, _, _, node_id) => {
view_item_extern_mod(name, _, node_id) => {
// n.b. we don't need to look at the path option here, because cstore already did
match self.session.cstore.find_extern_mod_stmt_cnum(node_id) {
Some(crate_id) => {
......
......@@ -994,15 +994,15 @@ fn clean(&self) -> Item {
#[deriving(Clone, Encodable, Decodable)]
pub enum ViewItemInner {
ExternMod(~str, Option<~str>, ~[Attribute], ast::NodeId),
ExternMod(~str, Option<~str>, ast::NodeId),
Import(~[ViewPath])
}
impl Clean<ViewItemInner> for ast::view_item_ {
fn clean(&self) -> ViewItemInner {
match self {
&ast::view_item_extern_mod(ref i, ref p, ref mi, ref id) =>
ExternMod(i.clean(), p.map(|(ref x, _)| x.to_owned()), mi.clean(), *id),
&ast::view_item_extern_mod(ref i, ref p, ref id) =>
ExternMod(i.clean(), p.map(|(ref x, _)| x.to_owned()), *id),
&ast::view_item_use(ref vp) => Import(vp.clean())
}
}
......
......@@ -995,7 +995,7 @@ fn fmt(s: &Initializer<'a>, f: &mut fmt::Formatter) {
clean::ViewItemItem(ref item) => {
match item.inner {
clean::ExternMod(ref name, ref src, _, _) => {
clean::ExternMod(ref name, ref src, _) => {
write!(w, "<tr><td><code>extern mod {}",
name.as_slice());
match *src {
......
......@@ -14,7 +14,8 @@
pub use crate_id::CrateId;
pub use target::{OutputType, Main, Lib, Test, Bench, Target, Build, Install};
pub use version::{Version, NoVersion, split_version_general, try_parsing_version};
pub use version::{Version, ExactRevision, NoVersion, split_version, split_version_general,
try_parsing_version};
pub use rustc::metadata::filesearch::rust_path;
use rustc::metadata::filesearch::libdir;
use rustc::driver::driver::host_triple;
......@@ -213,8 +214,9 @@ pub fn library_in_workspace(path: &Path, short_name: &str, where: Target,
}
// rustc doesn't use target-specific subdirectories
pub fn system_library(sysroot: &Path, lib_name: &str) -> Option<Path> {
library_in(lib_name, &NoVersion, &sysroot.join(libdir()))
pub fn system_library(sysroot: &Path, crate_id: &str) -> Option<Path> {
let (lib_name, version) = split_crate_id(crate_id);
library_in(lib_name, &version, &sysroot.join(libdir()))
}
fn library_in(short_name: &str, version: &Version, dir_to_search: &Path) -> Option<Path> {
......@@ -268,6 +270,7 @@ fn library_in(short_name: &str, version: &Version, dir_to_search: &Path) -> Opti
}
None => break
}
}
_ => { f_name = f_name.slice(0, i); }
}
......@@ -293,6 +296,22 @@ fn library_in(short_name: &str, version: &Version, dir_to_search: &Path) -> Opti
abs_path
}
fn split_crate_id<'a>(crate_id: &'a str) -> (&'a str, Version) {
match split_version(crate_id) {
Some((name, vers)) =>
match vers {
ExactRevision(ref v) => match v.find('-') {
Some(pos) => (name, ExactRevision(v.slice(0, pos).to_owned())),
None => (name, ExactRevision(v.to_owned()))
},
_ => (name, vers)
},
None => (crate_id, NoVersion)
}
}
/// Returns the executable that would be installed for <crateid>
/// in <workspace>
/// As a side effect, creates the bin-dir if it doesn't exist
......
......@@ -461,7 +461,7 @@ fn visit_view_item(&mut self, vi: &ast::view_item, env: ()) {
match vi.node {
// ignore metadata, I guess
ast::view_item_extern_mod(lib_ident, path_opt, _, _) => {
ast::view_item_extern_mod(lib_ident, path_opt, _) => {
let lib_name = match path_opt {
Some((p, _)) => p,
None => self.sess.str_of(lib_ident)
......
......@@ -1057,7 +1057,7 @@ pub enum view_item_ {
// optional @str: if present, this is a location (containing
// arbitrary characters) from which to fetch the crate sources
// For example, extern mod whatever = "github.com/mozilla/rust"
view_item_extern_mod(Ident, Option<(@str, StrStyle)>, ~[@MetaItem], NodeId),
view_item_extern_mod(Ident, Option<(@str, StrStyle)>, NodeId),
view_item_use(~[@view_path]),
}
......
......@@ -419,7 +419,7 @@ fn visit_mod(&mut self,
fn visit_view_item(&mut self, view_item: &view_item, env: ()) {
match view_item.node {
view_item_extern_mod(_, _, _, node_id) => {
view_item_extern_mod(_, _, node_id) => {
self.operation.visit_id(node_id)
}
view_item_use(ref view_paths) => {
......
......@@ -66,11 +66,9 @@ fn fold_view_item(&mut self, vi: &view_item) -> view_item {
let inner_view_item = match vi.node {
view_item_extern_mod(ref ident,
string,
ref meta_items,
node_id) => {
view_item_extern_mod(ident.clone(),
string,
self.fold_meta_items(*meta_items),
self.new_id(node_id))
}
view_item_use(ref view_paths) => {
......
......@@ -45,6 +45,7 @@ pub enum ObsoleteSyntax {
ObsoleteBoxedClosure,
ObsoleteClosureType,
ObsoleteMultipleImport,
ObsoleteExternModAttributesInParens
}
impl to_bytes::IterBytes for ObsoleteSyntax {
......@@ -145,6 +146,11 @@ fn obsolete(&self, sp: Span, kind: ObsoleteSyntax) {
"multiple imports",
"only one import is allowed per `use` statement"
),
ObsoleteExternModAttributesInParens => (
"`extern mod` with linkage attribute list",
"use `extern mod foo = \"bar\";` instead of \
`extern mod foo (name = \"bar\")`"
)
};
self.report(sp, kind, kind_str, desc);
......
......@@ -4446,11 +4446,18 @@ fn parse_item_foreign_mod(&self,
self.span_err(*self.span, "an ABI may not be specified here");
}
if *self.token == token::LPAREN {
// `extern mod foo (name = "bar"[,vers = "version"]) is obsolete,
// `extern mod foo = "bar#[version]";` should be used.
// Parse obsolete options to avoid wired parser errors
self.parse_optional_meta();
self.obsolete(*self.span, ObsoleteExternModAttributesInParens);
}
// extern mod foo;
let metadata = self.parse_optional_meta();
self.expect(&token::SEMI);
iovi_view_item(ast::view_item {
node: view_item_extern_mod(ident, maybe_path, metadata, ast::DUMMY_NODE_ID),
node: view_item_extern_mod(ident, maybe_path, ast::DUMMY_NODE_ID),
attrs: attrs,
vis: visibility,
span: mk_sp(lo, self.last_span.hi)
......
......@@ -1952,7 +1952,7 @@ pub fn print_view_item(s: @ps, item: &ast::view_item) {
print_outer_attributes(s, item.attrs);
print_visibility(s, item.vis);
match item.node {
ast::view_item_extern_mod(id, ref optional_path, ref mta, _) => {
ast::view_item_extern_mod(id, ref optional_path, _) => {
head(s, "extern mod");
print_ident(s, id);
for &(ref p, style) in optional_path.iter() {
......@@ -1961,11 +1961,6 @@ pub fn print_view_item(s: @ps, item: &ast::view_item) {
space(s.s);
print_string(s, *p, style);
}
if !mta.is_empty() {
popen(s);
commasep(s, consistent, *mta, |p, &i| print_meta_item(p, i));
pclose(s);
}
}
ast::view_item_use(ref vps) => {
......
......@@ -139,7 +139,7 @@ pub fn walk_mod<E:Clone, V:Visitor<E>>(visitor: &mut V, module: &_mod, env: E) {
pub fn walk_view_item<E:Clone, V:Visitor<E>>(visitor: &mut V, vi: &view_item, env: E) {
match vi.node {
view_item_extern_mod(name, _, _, _) => {
view_item_extern_mod(name, _, _) => {
visitor.visit_ident(vi.span, name, env)
}
view_item_use(ref paths) => {
......
......@@ -13,7 +13,7 @@
#[crate_id="crateresolve8#0.1"];
extern mod crateresolve8(vers = "0.1", package_id="crateresolve8#0.1");
extern mod crateresolve8 = "crateresolve8#0.1";
//extern mod crateresolve8(vers = "0.1");
pub fn main() {
......
......@@ -11,7 +11,7 @@
// xfail-fast
//aux-build:extern-crosscrate-source.rs
extern mod externcallback(vers = "0.1");
extern mod externcallback = "externcallback#0.1";
fn fact(n: uint) -> uint {
unsafe {
......
......@@ -12,7 +12,6 @@
// xfail-fast
#[crate_id="issue-6919"];
extern mod issue6919_3;
pub fn main() {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册