Skip to content

Commit

Permalink
make it a migration lint
Browse files Browse the repository at this point in the history
  • Loading branch information
mark-i-m committed Jul 24, 2018
1 parent 5d87272 commit b206aed
Show file tree
Hide file tree
Showing 4 changed files with 54 additions and 6 deletions.
15 changes: 12 additions & 3 deletions src/librustc_lint/lib.rs
Expand Up @@ -44,9 +44,13 @@ extern crate syntax_pos;

use rustc::lint;
use rustc::lint::{LateContext, LateLintPass, LintPass, LintArray};
use rustc::lint::builtin::{BARE_TRAIT_OBJECTS, ABSOLUTE_PATHS_NOT_STARTING_WITH_CRATE,
ELIDED_LIFETIMES_IN_PATHS};
use rustc::lint::builtin::MACRO_USE_EXTERN_CRATE;
use rustc::lint::builtin::{
BARE_TRAIT_OBJECTS,
ABSOLUTE_PATHS_NOT_STARTING_WITH_CRATE,
MACRO_USE_EXTERN_CRATE,
ELIDED_LIFETIMES_IN_PATHS,
parser::QUESTION_MARK_MACRO_SEP
};
use rustc::session;
use rustc::util;
use rustc::hir;
Expand Down Expand Up @@ -321,6 +325,11 @@ pub fn register_builtins(store: &mut lint::LintStore, sess: Option<&Session>) {
reference: "issue #50504 <https://github.com/rust-lang/rust/issues/50504>",
edition: None,
},
FutureIncompatibleInfo {
id: LintId::of(QUESTION_MARK_MACRO_SEP),
reference: "issue #48075 <https://github.com/rust-lang/rust/issues/48075>",
edition: Some(Edition::Edition2018),
}
]);

// Register renamed and removed lints
Expand Down
10 changes: 10 additions & 0 deletions src/libsyntax/early_buffered_lints.rs
@@ -1,3 +1,13 @@
// Copyright 2017 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.

//! Allows the buffering of lints for later.
//!
//! Since we cannot have a dependency on `librustc`, we implement some types here that are somewhat
Expand Down
2 changes: 2 additions & 0 deletions src/libsyntax/ext/tt/macro_rules.rs
Expand Up @@ -247,6 +247,7 @@ pub fn compile(sess: &ParseSess, features: &Features, def: &ast::Item, edition:
features,
&def.attrs,
edition,
def.id,
)
.pop()
.unwrap();
Expand All @@ -272,6 +273,7 @@ pub fn compile(sess: &ParseSess, features: &Features, def: &ast::Item, edition:
features,
&def.attrs,
edition,
def.id,
).pop()
.unwrap();
}
Expand Down
33 changes: 30 additions & 3 deletions src/libsyntax/ext/tt/quoted.rs
Expand Up @@ -8,6 +8,8 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.

use ast::NodeId;
use early_buffered_lints::BufferedEarlyLintId;
use ext::tt::macro_parser;
use feature_gate::{self, emit_feature_err, Features, GateIssue};
use parse::{token, ParseSess};
Expand Down Expand Up @@ -175,6 +177,7 @@ impl TokenTree {
/// - `features`, `attrs`: language feature flags and attributes so that we know whether to use
/// unstable features or not.
/// - `edition`: which edition are we in.
/// - `macro_node_id`: the NodeId of the macro we are parsing.
///
/// # Returns
///
Expand All @@ -186,6 +189,7 @@ pub fn parse(
features: &Features,
attrs: &[ast::Attribute],
edition: Edition,
macro_node_id: NodeId,
) -> Vec<TokenTree> {
// Will contain the final collection of `self::TokenTree`
let mut result = Vec::new();
Expand All @@ -204,6 +208,7 @@ pub fn parse(
features,
attrs,
edition,
macro_node_id,
);
match tree {
TokenTree::MetaVar(start_sp, ident) if expect_matchers => {
Expand Down Expand Up @@ -265,6 +270,7 @@ fn parse_tree<I>(
features: &Features,
attrs: &[ast::Attribute],
edition: Edition,
macro_node_id: NodeId,
) -> TokenTree
where
I: Iterator<Item = tokenstream::TokenTree>,
Expand All @@ -290,10 +296,19 @@ where
features,
attrs,
edition,
macro_node_id,
);
// Get the Kleene operator and optional separator
let (separator, op) =
parse_sep_and_kleene_op(trees, span, sess, features, attrs, edition);
parse_sep_and_kleene_op(
trees,
span,
sess,
features,
attrs,
edition,
macro_node_id,
);
// Count the number of captured "names" (i.e. named metavars)
let name_captures = macro_parser::count_names(&sequence);
TokenTree::Sequence(
Expand Down Expand Up @@ -350,6 +365,7 @@ where
features,
attrs,
edition,
macro_node_id,
),
}),
),
Expand Down Expand Up @@ -413,12 +429,20 @@ fn parse_sep_and_kleene_op<I>(
features: &Features,
attrs: &[ast::Attribute],
edition: Edition,
macro_node_id: NodeId,
) -> (Option<token::Token>, KleeneOp)
where
I: Iterator<Item = tokenstream::TokenTree>,
{
match edition {
Edition::Edition2015 => parse_sep_and_kleene_op_2015(input, span, sess, features, attrs),
Edition::Edition2015 => parse_sep_and_kleene_op_2015(
input,
span,
sess,
features,
attrs,
macro_node_id,
),
Edition::Edition2018 => parse_sep_and_kleene_op_2018(input, span, sess, features, attrs),
_ => unimplemented!(),
}
Expand All @@ -431,6 +455,7 @@ fn parse_sep_and_kleene_op_2015<I>(
sess: &ParseSess,
_features: &Features,
_attrs: &[ast::Attribute],
macro_node_id: NodeId,
) -> (Option<token::Token>, KleeneOp)
where
I: Iterator<Item = tokenstream::TokenTree>,
Expand Down Expand Up @@ -474,8 +499,10 @@ where
// #2 is a Kleene op, which is the the only valid option
Ok(Ok((op, _))) => {
// Warn that `?` as a separator will be deprecated
sess.span_diagnostic.span_warn(
sess.buffer_lint(
BufferedEarlyLintId::QuestionMarkMacroSep,
op1_span,
macro_node_id,
"using `?` as a separator is deprecated and will be \
a hard error in an upcoming edition",
);
Expand Down

0 comments on commit b206aed

Please sign in to comment.