Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
6c8bb5a6
R
Rust
项目概览
int
/
Rust
12 个月 前同步成功
通知
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,发现更多精彩内容 >>
提交
6c8bb5a6
编写于
7月 07, 2014
作者:
J
John Clements
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
macro in method position parsing
上级
6ee2155f
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
42 addition
and
13 deletion
+42
-13
src/libsyntax/parse/parser.rs
src/libsyntax/parse/parser.rs
+42
-13
未找到文件。
src/libsyntax/parse/parser.rs
浏览文件 @
6c8bb5a6
...
...
@@ -3246,6 +3246,7 @@ fn check_expected_item(p: &mut Parser, found_attrs: bool) {
}
else
if
is_ident
(
&
self
.token
)
&&
!
token
::
is_any_keyword
(
&
self
.token
)
&&
self
.look_ahead
(
1
,
|
t
|
*
t
==
token
::
NOT
)
{
// it's a macro invocation:
check_expected_item
(
self
,
!
item_attrs
.is_empty
());
...
...
@@ -4021,7 +4022,7 @@ fn parse_item_fn(&mut self, fn_style: FnStyle, abi: abi::Abi) -> ItemInfo {
}
/// Parse a method in a trait impl, starting with `attrs` attributes.
fn
parse_method
(
&
mut
self
,
pub
fn
parse_method
(
&
mut
self
,
already_parsed_attrs
:
Option
<
Vec
<
Attribute
>>
)
->
Gc
<
Method
>
{
let
next_attrs
=
self
.parse_outer_attributes
();
let
attrs
=
match
already_parsed_attrs
{
...
...
@@ -4031,22 +4032,50 @@ fn parse_method(&mut self,
let
lo
=
self
.span.lo
;
let
visa
=
self
.parse_visibility
();
let
fn_style
=
self
.parse_fn_style
();
let
ident
=
self
.parse_ident
();
let
generics
=
self
.parse_generics
();
let
(
explicit_self
,
decl
)
=
self
.parse_fn_decl_with_self
(|
p
|
{
p
.parse_arg
()
});
// code copied from parse_macro_use_or_failure... abstraction!
let
(
method_
,
hi
,
new_attrs
)
=
{
if
!
token
::
is_any_keyword
(
&
self
.token
)
&&
self
.look_ahead
(
1
,
|
t
|
*
t
==
token
::
NOT
)
&&
(
self
.look_ahead
(
2
,
|
t
|
*
t
==
token
::
LPAREN
)
||
self
.look_ahead
(
2
,
|
t
|
*
t
==
token
::
LBRACE
))
{
// method macro.
let
pth
=
self
.parse_path
(
NoTypesAllowed
)
.path
;
self
.expect
(
&
token
::
NOT
);
let
(
inner_attrs
,
body
)
=
self
.parse_inner_attrs_and_block
();
let
hi
=
body
.span.hi
;
let
attrs
=
attrs
.append
(
inner_attrs
.as_slice
());
// eat a matched-delimiter token tree:
let
tts
=
match
token
::
close_delimiter_for
(
&
self
.token
)
{
Some
(
ket
)
=>
{
self
.bump
();
self
.parse_seq_to_end
(
&
ket
,
seq_sep_none
(),
|
p
|
p
.parse_token_tree
())
}
None
=>
self
.fatal
(
"expected open delimiter"
)
};
let
m_
=
ast
::
MacInvocTT
(
pth
,
tts
,
EMPTY_CTXT
);
let
m
:
ast
::
Mac
=
codemap
::
Spanned
{
node
:
m_
,
span
:
mk_sp
(
self
.span.lo
,
self
.span.hi
)
};
(
ast
::
MethMac
(
m
),
self
.span.hi
,
attrs
)
}
else
{
let
visa
=
self
.parse_visibility
();
let
fn_style
=
self
.parse_fn_style
();
let
ident
=
self
.parse_ident
();
let
generics
=
self
.parse_generics
();
let
(
explicit_self
,
decl
)
=
self
.parse_fn_decl_with_self
(|
p
|
{
p
.parse_arg
()
});
let
(
inner_attrs
,
body
)
=
self
.parse_inner_attrs_and_block
();
let
new_attrs
=
attrs
.append
(
inner_attrs
.as_slice
());
(
ast
::
MethDecl
(
ident
,
generics
,
explicit_self
,
fn_style
,
decl
,
body
,
visa
),
body
.span.hi
,
new_attrs
)
}
};
box
(
GC
)
ast
::
Method
{
attrs
:
attrs
,
attrs
:
new_
attrs
,
id
:
ast
::
DUMMY_NODE_ID
,
span
:
mk_sp
(
lo
,
hi
),
node
:
ast
::
MethDecl
(
ident
,
generics
,
explicit_self
,
fn_style
,
decl
,
body
,
visa
)
,
node
:
method_
,
}
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录