Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
eb74711b
R
Rust
项目概览
int
/
Rust
11 个月 前同步成功
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
Rust
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
未验证
提交
eb74711b
编写于
10月 26, 2018
作者:
K
kennytm
浏览文件
操作
浏览文件
下载
差异文件
Rollup merge of #55298 - estebank:macro-def, r=pnkfelix
Point at macro definition when no rules expect token Fix #35150.
上级
c6cd57dd
1ab45ec7
变更
21
隐藏空白更改
内联
并排
Showing
21 changed file
with
152 addition
and
50 deletion
+152
-50
src/libsyntax/ext/base.rs
src/libsyntax/ext/base.rs
+14
-4
src/libsyntax/ext/expand.rs
src/libsyntax/ext/expand.rs
+7
-2
src/libsyntax/ext/tt/macro_rules.rs
src/libsyntax/ext/tt/macro_rules.rs
+18
-7
src/test/run-pass-fulldeps/auxiliary/plugin_args.rs
src/test/run-pass-fulldeps/auxiliary/plugin_args.rs
+2
-1
src/test/ui/editions/edition-keywords-2015-2015-parsing.stderr
...est/ui/editions/edition-keywords-2015-2015-parsing.stderr
+2
-2
src/test/ui/editions/edition-keywords-2015-2018-parsing.stderr
...est/ui/editions/edition-keywords-2015-2018-parsing.stderr
+2
-2
src/test/ui/editions/edition-keywords-2018-2015-parsing.stderr
...est/ui/editions/edition-keywords-2018-2015-parsing.stderr
+2
-2
src/test/ui/editions/edition-keywords-2018-2018-parsing.stderr
...est/ui/editions/edition-keywords-2018-2018-parsing.stderr
+2
-2
src/test/ui/empty/empty-comment.stderr
src/test/ui/empty/empty-comment.stderr
+4
-1
src/test/ui/fail-simple.stderr
src/test/ui/fail-simple.stderr
+1
-1
src/test/ui/issues/issue-7970a.stderr
src/test/ui/issues/issue-7970a.stderr
+4
-1
src/test/ui/macros/macro-at-most-once-rep-2018-feature-gate.stderr
...ui/macros/macro-at-most-once-rep-2018-feature-gate.stderr
+12
-3
src/test/ui/macros/macro-at-most-once-rep-2018.stderr
src/test/ui/macros/macro-at-most-once-rep-2018.stderr
+44
-11
src/test/ui/macros/macro-non-lifetime.stderr
src/test/ui/macros/macro-non-lifetime.stderr
+4
-1
src/test/ui/macros/missing-comma.stderr
src/test/ui/macros/missing-comma.stderr
+16
-4
src/test/ui/macros/nonterminal-matching.stderr
src/test/ui/macros/nonterminal-matching.stderr
+1
-1
src/test/ui/macros/trace_faulty_macros.stderr
src/test/ui/macros/trace_faulty_macros.stderr
+4
-1
src/test/ui/parser/macro/macro-doc-comments-1.stderr
src/test/ui/parser/macro/macro-doc-comments-1.stderr
+4
-1
src/test/ui/parser/macro/macro-doc-comments-2.stderr
src/test/ui/parser/macro/macro-doc-comments-2.stderr
+4
-1
src/test/ui/underscore-ident-matcher.stderr
src/test/ui/underscore-ident-matcher.stderr
+4
-1
src/test/ui/vec/vec-macro-with-comma-only.stderr
src/test/ui/vec/vec-macro-with-comma-only.stderr
+1
-1
未找到文件。
src/libsyntax/ext/base.rs
浏览文件 @
eb74711b
...
...
@@ -247,8 +247,13 @@ fn expand<'cx>(&self,
/// Represents a thing that maps token trees to Macro Results
pub
trait
TTMacroExpander
{
fn
expand
<
'cx
>
(
&
self
,
ecx
:
&
'cx
mut
ExtCtxt
,
span
:
Span
,
input
:
TokenStream
)
->
Box
<
dyn
MacResult
+
'cx
>
;
fn
expand
<
'cx
>
(
&
self
,
ecx
:
&
'cx
mut
ExtCtxt
,
span
:
Span
,
input
:
TokenStream
,
def_span
:
Option
<
Span
>
,
)
->
Box
<
dyn
MacResult
+
'cx
>
;
}
pub
type
MacroExpanderFn
=
...
...
@@ -259,8 +264,13 @@ impl<F> TTMacroExpander for F
where
F
:
for
<
'cx
>
Fn
(
&
'cx
mut
ExtCtxt
,
Span
,
&
[
tokenstream
::
TokenTree
])
->
Box
<
dyn
MacResult
+
'cx
>
{
fn
expand
<
'cx
>
(
&
self
,
ecx
:
&
'cx
mut
ExtCtxt
,
span
:
Span
,
input
:
TokenStream
)
->
Box
<
dyn
MacResult
+
'cx
>
{
fn
expand
<
'cx
>
(
&
self
,
ecx
:
&
'cx
mut
ExtCtxt
,
span
:
Span
,
input
:
TokenStream
,
_
def_span
:
Option
<
Span
>
,
)
->
Box
<
dyn
MacResult
+
'cx
>
{
struct
AvoidInterpolatedIdents
;
impl
Folder
for
AvoidInterpolatedIdents
{
...
...
src/libsyntax/ext/expand.rs
浏览文件 @
eb74711b
...
...
@@ -764,7 +764,7 @@ fn expand_bang_invoc(&mut self,
edition
)
{
dummy_span
}
else
{
kind
.make_from
(
expander
.expand
(
self
.cx
,
span
,
mac
.node
.stream
()))
kind
.make_from
(
expander
.expand
(
self
.cx
,
span
,
mac
.node
.stream
()
,
None
))
}
}
...
...
@@ -785,7 +785,12 @@ fn expand_bang_invoc(&mut self,
edition
)
{
dummy_span
}
else
{
kind
.make_from
(
expander
.expand
(
self
.cx
,
span
,
mac
.node
.stream
()))
kind
.make_from
(
expander
.expand
(
self
.cx
,
span
,
mac
.node
.stream
(),
def_info
.map
(|(
_
,
s
)|
s
),
))
}
}
...
...
src/libsyntax/ext/tt/macro_rules.rs
浏览文件 @
eb74711b
...
...
@@ -79,16 +79,19 @@ struct MacroRulesMacroExpander {
}
impl
TTMacroExpander
for
MacroRulesMacroExpander
{
fn
expand
<
'cx
>
(
&
self
,
cx
:
&
'cx
mut
ExtCtxt
,
sp
:
Span
,
input
:
TokenStream
)
->
Box
<
dyn
MacResult
+
'cx
>
{
fn
expand
<
'cx
>
(
&
self
,
cx
:
&
'cx
mut
ExtCtxt
,
sp
:
Span
,
input
:
TokenStream
,
def_span
:
Option
<
Span
>
,
)
->
Box
<
dyn
MacResult
+
'cx
>
{
if
!
self
.valid
{
return
DummyResult
::
any
(
sp
);
}
generic_extension
(
cx
,
sp
,
def_span
,
self
.name
,
input
,
&
self
.lhses
,
...
...
@@ -104,6 +107,7 @@ fn trace_macros_note(cx: &mut ExtCtxt, sp: Span, message: String) {
/// Given `lhses` and `rhses`, this is the new macro we create
fn
generic_extension
<
'cx
>
(
cx
:
&
'cx
mut
ExtCtxt
,
sp
:
Span
,
def_span
:
Option
<
Span
>
,
name
:
ast
::
Ident
,
arg
:
TokenStream
,
lhses
:
&
[
quoted
::
TokenTree
],
...
...
@@ -183,7 +187,14 @@ fn generic_extension<'cx>(cx: &'cx mut ExtCtxt,
}
let
best_fail_msg
=
parse_failure_msg
(
best_fail_tok
.expect
(
"ran no matchers"
));
let
mut
err
=
cx
.struct_span_err
(
best_fail_spot
.substitute_dummy
(
sp
),
&
best_fail_msg
);
let
span
=
best_fail_spot
.substitute_dummy
(
sp
);
let
mut
err
=
cx
.struct_span_err
(
span
,
&
best_fail_msg
);
err
.span_label
(
span
,
best_fail_msg
);
if
let
Some
(
sp
)
=
def_span
{
if
cx
.source_map
()
.span_to_filename
(
sp
)
.is_real
()
&&
!
sp
.is_dummy
()
{
err
.span_label
(
cx
.source_map
()
.def_span
(
sp
),
"when calling this macro"
);
}
}
// Check whether there's a missing comma in this macro call, like `println!("{}" a);`
if
let
Some
((
arg
,
comma_span
))
=
arg
.add_comma
()
{
...
...
@@ -194,7 +205,7 @@ fn generic_extension<'cx>(cx: &'cx mut ExtCtxt,
};
match
TokenTree
::
parse
(
cx
,
lhs_tt
,
arg
.clone
())
{
Success
(
_
)
=>
{
if
comma_span
==
DUMMY_SP
{
if
comma_span
.is_dummy
()
{
err
.note
(
"you might be missing a comma"
);
}
else
{
err
.span_suggestion_short_with_applicability
(
...
...
src/test/run-pass-fulldeps/auxiliary/plugin_args.rs
浏览文件 @
eb74711b
...
...
@@ -38,7 +38,8 @@ impl TTMacroExpander for Expander {
fn
expand
<
'cx
>
(
&
self
,
ecx
:
&
'cx
mut
ExtCtxt
,
sp
:
Span
,
_
:
TokenStream
)
->
Box
<
MacResult
+
'cx
>
{
_
:
TokenStream
,
_
:
Option
<
Span
>
)
->
Box
<
MacResult
+
'cx
>
{
let
args
=
self
.args
.iter
()
.map
(|
i
|
pprust
::
meta_list_item_to_string
(
i
))
.collect
::
<
Vec
<
_
>>
()
.join
(
", "
);
MacEager
::
expr
(
ecx
.expr_str
(
sp
,
Symbol
::
intern
(
&
args
)))
...
...
src/test/ui/editions/edition-keywords-2015-2015-parsing.stderr
浏览文件 @
eb74711b
...
...
@@ -2,13 +2,13 @@ error: no rules expected the token `r#async`
--> $DIR/edition-keywords-2015-2015-parsing.rs:22:31
|
LL | r#async = consumes_async!(r#async); //~ ERROR no rules expected the token `r#async`
| ^^^^^^^
| ^^^^^^^
no rules expected the token `r#async`
error: no rules expected the token `async`
--> $DIR/edition-keywords-2015-2015-parsing.rs:23:35
|
LL | r#async = consumes_async_raw!(async); //~ ERROR no rules expected the token `async`
| ^^^^^
| ^^^^^
no rules expected the token `async`
error: aborting due to 2 previous errors
src/test/ui/editions/edition-keywords-2015-2018-parsing.stderr
浏览文件 @
eb74711b
...
...
@@ -2,13 +2,13 @@ error: no rules expected the token `r#async`
--> $DIR/edition-keywords-2015-2018-parsing.rs:22:31
|
LL | r#async = consumes_async!(r#async); //~ ERROR no rules expected the token `r#async`
| ^^^^^^^
| ^^^^^^^
no rules expected the token `r#async`
error: no rules expected the token `async`
--> $DIR/edition-keywords-2015-2018-parsing.rs:23:35
|
LL | r#async = consumes_async_raw!(async); //~ ERROR no rules expected the token `async`
| ^^^^^
| ^^^^^
no rules expected the token `async`
error: aborting due to 2 previous errors
src/test/ui/editions/edition-keywords-2018-2015-parsing.stderr
浏览文件 @
eb74711b
...
...
@@ -14,13 +14,13 @@ error: no rules expected the token `r#async`
--> $DIR/edition-keywords-2018-2015-parsing.rs:22:31
|
LL | r#async = consumes_async!(r#async); //~ ERROR no rules expected the token `r#async`
| ^^^^^^^
| ^^^^^^^
no rules expected the token `r#async`
error: no rules expected the token `async`
--> $DIR/edition-keywords-2018-2015-parsing.rs:23:35
|
LL | r#async = consumes_async_raw!(async); //~ ERROR no rules expected the token `async`
| ^^^^^
| ^^^^^
no rules expected the token `async`
error: expected one of `move`, `|`, or `||`, found `<eof>`
--> <::edition_kw_macro_2015::passes_ident macros>:1:22
...
...
src/test/ui/editions/edition-keywords-2018-2018-parsing.stderr
浏览文件 @
eb74711b
...
...
@@ -14,13 +14,13 @@ error: no rules expected the token `r#async`
--> $DIR/edition-keywords-2018-2018-parsing.rs:22:31
|
LL | r#async = consumes_async!(r#async); //~ ERROR no rules expected the token `r#async`
| ^^^^^^^
| ^^^^^^^
no rules expected the token `r#async`
error: no rules expected the token `async`
--> $DIR/edition-keywords-2018-2018-parsing.rs:23:35
|
LL | r#async = consumes_async_raw!(async); //~ ERROR no rules expected the token `async`
| ^^^^^
| ^^^^^
no rules expected the token `async`
error: expected one of `move`, `|`, or `||`, found `<eof>`
--> <::edition_kw_macro_2018::passes_ident macros>:1:22
...
...
src/test/ui/empty/empty-comment.stderr
浏览文件 @
eb74711b
error: unexpected end of macro invocation
--> $DIR/empty-comment.rs:20:5
|
LL | macro_rules! one_arg_macro {
| -------------------------- when calling this macro
...
LL | one_arg_macro!(/**/); //~ ERROR unexpected end
| ^^^^^^^^^^^^^^^^^^^^^
| ^^^^^^^^^^^^^^^^^^^^^
unexpected end of macro invocation
error: aborting due to previous error
src/test/ui/fail-simple.stderr
浏览文件 @
eb74711b
...
...
@@ -2,7 +2,7 @@ error: no rules expected the token `@`
--> $DIR/fail-simple.rs:12:12
|
LL | panic!(@); //~ ERROR no rules expected the token `@`
| ^
| ^
no rules expected the token `@`
error: aborting due to previous error
src/test/ui/issues/issue-7970a.stderr
浏览文件 @
eb74711b
error: unexpected end of macro invocation
--> $DIR/issue-7970a.rs:16:5
|
LL | macro_rules! one_arg_macro {
| -------------------------- when calling this macro
...
LL | one_arg_macro!();
| ^^^^^^^^^^^^^^^^^
| ^^^^^^^^^^^^^^^^^
unexpected end of macro invocation
error: aborting due to previous error
src/test/ui/macros/macro-at-most-once-rep-2018-feature-gate.stderr
浏览文件 @
eb74711b
...
...
@@ -51,20 +51,29 @@ LL | ($(a)?*) => {}
error: no rules expected the token `?`
--> $DIR/macro-at-most-once-rep-2018-feature-gate.rs:41:11
|
LL | macro_rules! foo {
| ---------------- when calling this macro
...
LL | foo!(a?); //~ ERROR no rules expected the token `?`
| ^
| ^
no rules expected the token `?`
error: no rules expected the token `?`
--> $DIR/macro-at-most-once-rep-2018-feature-gate.rs:42:11
|
LL | macro_rules! foo {
| ---------------- when calling this macro
...
LL | foo!(a?a); //~ ERROR no rules expected the token `?`
| ^
| ^
no rules expected the token `?`
error: no rules expected the token `?`
--> $DIR/macro-at-most-once-rep-2018-feature-gate.rs:43:11
|
LL | macro_rules! foo {
| ---------------- when calling this macro
...
LL | foo!(a?a?a); //~ ERROR no rules expected the token `?`
| ^
| ^
no rules expected the token `?`
error: aborting due to 10 previous errors
...
...
src/test/ui/macros/macro-at-most-once-rep-2018.stderr
浏览文件 @
eb74711b
...
...
@@ -7,68 +7,101 @@ LL | ($(a),?) => {} //~ERROR the `?` macro repetition operator
error: no rules expected the token `?`
--> $DIR/macro-at-most-once-rep-2018.rs:36:11
|
LL | macro_rules! foo {
| ---------------- when calling this macro
...
LL | foo!(a?); //~ ERROR no rules expected the token `?`
| ^
| ^
no rules expected the token `?`
error: no rules expected the token `?`
--> $DIR/macro-at-most-once-rep-2018.rs:37:11
|
LL | macro_rules! foo {
| ---------------- when calling this macro
...
LL | foo!(a?a); //~ ERROR no rules expected the token `?`
| ^
| ^
no rules expected the token `?`
error: no rules expected the token `?`
--> $DIR/macro-at-most-once-rep-2018.rs:38:11
|
LL | macro_rules! foo {
| ---------------- when calling this macro
...
LL | foo!(a?a?a); //~ ERROR no rules expected the token `?`
| ^
| ^
no rules expected the token `?`
error: unexpected end of macro invocation
--> $DIR/macro-at-most-once-rep-2018.rs:40:5
|
LL | macro_rules! barplus {
| -------------------- when calling this macro
...
LL | barplus!(); //~ERROR unexpected end of macro invocation
| ^^^^^^^^^^^
| ^^^^^^^^^^^
unexpected end of macro invocation
error: unexpected end of macro invocation
--> $DIR/macro-at-most-once-rep-2018.rs:41:14
|
LL | macro_rules! barplus {
| -------------------- when calling this macro
...
LL | barplus!(a); //~ERROR unexpected end of macro invocation
| ^
| ^
unexpected end of macro invocation
error: no rules expected the token `?`
--> $DIR/macro-at-most-once-rep-2018.rs:42:15
|
LL | macro_rules! barplus {
| -------------------- when calling this macro
...
LL | barplus!(a?); //~ ERROR no rules expected the token `?`
| ^
| ^
no rules expected the token `?`
error: no rules expected the token `?`
--> $DIR/macro-at-most-once-rep-2018.rs:43:15
|
LL | macro_rules! barplus {
| -------------------- when calling this macro
...
LL | barplus!(a?a); //~ ERROR no rules expected the token `?`
| ^
| ^
no rules expected the token `?`
error: unexpected end of macro invocation
--> $DIR/macro-at-most-once-rep-2018.rs:47:5
|
LL | macro_rules! barstar {
| -------------------- when calling this macro
...
LL | barstar!(); //~ERROR unexpected end of macro invocation
| ^^^^^^^^^^^
| ^^^^^^^^^^^
unexpected end of macro invocation
error: unexpected end of macro invocation
--> $DIR/macro-at-most-once-rep-2018.rs:48:14
|
LL | macro_rules! barstar {
| -------------------- when calling this macro
...
LL | barstar!(a); //~ERROR unexpected end of macro invocation
| ^
| ^
unexpected end of macro invocation
error: no rules expected the token `?`
--> $DIR/macro-at-most-once-rep-2018.rs:49:15
|
LL | macro_rules! barstar {
| -------------------- when calling this macro
...
LL | barstar!(a?); //~ ERROR no rules expected the token `?`
| ^
| ^
no rules expected the token `?`
error: no rules expected the token `?`
--> $DIR/macro-at-most-once-rep-2018.rs:50:15
|
LL | macro_rules! barstar {
| -------------------- when calling this macro
...
LL | barstar!(a?a); //~ ERROR no rules expected the token `?`
| ^
| ^
no rules expected the token `?`
error: aborting due to 12 previous errors
src/test/ui/macros/macro-non-lifetime.stderr
浏览文件 @
eb74711b
error: no rules expected the token `a`
--> $DIR/macro-non-lifetime.rs:18:8
|
LL | macro_rules! m { ($x:lifetime) => { } }
| -------------- when calling this macro
...
LL | m!(a);
| ^
| ^
no rules expected the token `a`
error: aborting due to previous error
src/test/ui/macros/missing-comma.stderr
浏览文件 @
eb74711b
...
...
@@ -7,32 +7,44 @@ LL | println!("{}" a);
error: no rules expected the token `b`
--> $DIR/missing-comma.rs:22:12
|
LL | macro_rules! foo {
| ---------------- when calling this macro
...
LL | foo!(a b);
| -^
| -^
no rules expected the token `b`
| |
| help: missing comma here
error: no rules expected the token `e`
--> $DIR/missing-comma.rs:24:21
|
LL | macro_rules! foo {
| ---------------- when calling this macro
...
LL | foo!(a, b, c, d e);
| -^
| -^
no rules expected the token `e`
| |
| help: missing comma here
error: no rules expected the token `d`
--> $DIR/missing-comma.rs:26:18
|
LL | macro_rules! foo {
| ---------------- when calling this macro
...
LL | foo!(a, b, c d, e);
| -^
| -^
no rules expected the token `d`
| |
| help: missing comma here
error: no rules expected the token `d`
--> $DIR/missing-comma.rs:28:18
|
LL | macro_rules! foo {
| ---------------- when calling this macro
...
LL | foo!(a, b, c d e);
| ^
| ^
no rules expected the token `d`
error: aborting due to 5 previous errors
src/test/ui/macros/nonterminal-matching.stderr
浏览文件 @
eb74711b
...
...
@@ -2,7 +2,7 @@ error: no rules expected the token `enum E { }`
--> $DIR/nonterminal-matching.rs:29:10
|
LL | n!(a $nt_item b); //~ ERROR no rules expected the token `enum E { }`
| ^^^^^^^^
| ^^^^^^^^
no rules expected the token `enum E { }`
...
LL | complex_nonterminal!(enum E {});
| -------------------------------- in this macro invocation
...
...
src/test/ui/macros/trace_faulty_macros.stderr
浏览文件 @
eb74711b
error: no rules expected the token `bcd`
--> $DIR/trace_faulty_macros.rs:17:26
|
LL | macro_rules! my_faulty_macro {
| ---------------------------- when calling this macro
LL | () => {
LL | my_faulty_macro!(bcd); //~ ERROR no rules
| ^^^
| ^^^
no rules expected the token `bcd`
...
LL | my_faulty_macro!();
| ------------------- in this macro invocation
...
...
src/test/ui/parser/macro/macro-doc-comments-1.stderr
浏览文件 @
eb74711b
error: no rules expected the token `!`
--> $DIR/macro-doc-comments-1.rs:16:5
|
LL | macro_rules! outer {
| ------------------ when calling this macro
...
LL | //! Inner
| ^^^^^^^^^
| ^^^^^^^^^
no rules expected the token `!`
error: aborting due to previous error
src/test/ui/parser/macro/macro-doc-comments-2.stderr
浏览文件 @
eb74711b
error: no rules expected the token `[`
--> $DIR/macro-doc-comments-2.rs:16:5
|
LL | macro_rules! inner {
| ------------------ when calling this macro
...
LL | /// Outer
| ^
| ^
no rules expected the token `[`
error: aborting due to previous error
src/test/ui/underscore-ident-matcher.stderr
浏览文件 @
eb74711b
error: no rules expected the token `_`
--> $DIR/underscore-ident-matcher.rs:18:19
|
LL | macro_rules! identity {
| --------------------- when calling this macro
...
LL | let identity!(_) = 10; //~ ERROR no rules expected the token `_`
| ^
| ^
no rules expected the token `_`
error: aborting due to previous error
src/test/ui/vec/vec-macro-with-comma-only.stderr
浏览文件 @
eb74711b
...
...
@@ -2,7 +2,7 @@ error: no rules expected the token `,`
--> $DIR/vec-macro-with-comma-only.rs:12:10
|
LL | vec![,]; //~ ERROR no rules expected the token `,`
| ^
| ^
no rules expected the token `,`
error: aborting due to previous error
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录