Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
1ff654af
R
Rust
项目概览
int
/
Rust
接近 1 年 前同步成功
通知
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,发现更多精彩内容 >>
未验证
提交
1ff654af
编写于
3月 02, 2022
作者:
M
Matthias Krüger
提交者:
GitHub
3月 02, 2022
浏览文件
操作
浏览文件
下载
差异文件
Rollup merge of #94498 - c410-f3r:chega-ja-deu, r=Dylan-DPC
9 - Make more use of `let_chains` Continuation of #94376. cc #53667
上级
aabd068f
a7b4d667
变更
8
隐藏空白更改
内联
并排
Showing
8 changed file
with
176 addition
and
218 deletion
+176
-218
compiler/rustc_trait_selection/src/lib.rs
compiler/rustc_trait_selection/src/lib.rs
+5
-4
compiler/rustc_trait_selection/src/traits/error_reporting/mod.rs
...r/rustc_trait_selection/src/traits/error_reporting/mod.rs
+44
-46
compiler/rustc_trait_selection/src/traits/error_reporting/suggestions.rs
...trait_selection/src/traits/error_reporting/suggestions.rs
+35
-50
compiler/rustc_trait_selection/src/traits/on_unimplemented.rs
...iler/rustc_trait_selection/src/traits/on_unimplemented.rs
+17
-21
compiler/rustc_trait_selection/src/traits/query/dropck_outlives.rs
...rustc_trait_selection/src/traits/query/dropck_outlives.rs
+13
-15
compiler/rustc_trait_selection/src/traits/relationships.rs
compiler/rustc_trait_selection/src/traits/relationships.rs
+30
-42
compiler/rustc_trait_selection/src/traits/select/mod.rs
compiler/rustc_trait_selection/src/traits/select/mod.rs
+16
-18
compiler/rustc_trait_selection/src/traits/wf.rs
compiler/rustc_trait_selection/src/traits/wf.rs
+16
-22
未找到文件。
compiler/rustc_trait_selection/src/lib.rs
浏览文件 @
1ff654af
...
...
@@ -10,19 +10,20 @@
//!
//! This API is completely unstable and subject to change.
#![allow(rustc::potential_query_instability)]
#![doc(html_root_url
=
"https://doc.rust-lang.org/nightly/nightly-rustc/"
)]
#![feature(bool_to_option)]
#![feature(box_patterns)]
#![feature(drain_filter)]
#![feature(control_flow_enum)]
#![feature(crate_visibility_modifier)]
#![feature(derive_default_enum)]
#![feature(drain_filter)]
#![feature(hash_drain_filter)]
#![feature(label_break_value)]
#![feature(let_chains)]
#![feature(let_else)]
#![feature(never_type)]
#![feature(crate_visibility_modifier)]
#![feature(control_flow_enum)]
#![recursion_limit
=
"512"
]
// For rustdoc
#![allow(rustc::potential_query_instability)]
#[macro_use]
extern
crate
rustc_macros
;
...
...
compiler/rustc_trait_selection/src/traits/error_reporting/mod.rs
浏览文件 @
1ff654af
...
...
@@ -1098,42 +1098,43 @@ fn report_arg_count_mismatch(
);
}
}
if
let
&
[
ArgKind
::
Tuple
(
_
,
ref
fields
)]
=
&
expected_args
[
..
]
{
if
fields
.len
()
==
found_args
.len
()
&&
is_closure
{
let
sugg
=
format!
(
"|({}){}|"
,
found_args
.iter
()
.map
(|
arg
|
match
arg
{
ArgKind
::
Arg
(
name
,
_
)
=>
name
.to_owned
(),
_
=>
"_"
.to_owned
(),
})
.collect
::
<
Vec
<
String
>>
()
.join
(
", "
),
// add type annotations if available
if
found_args
.iter
()
.any
(|
arg
|
match
arg
{
ArgKind
::
Arg
(
_
,
ty
)
=>
ty
!=
"_"
,
_
=>
false
,
})
{
format!
(
": ({})"
,
fields
.iter
()
.map
(|(
_
,
ty
)|
ty
.to_owned
())
.collect
::
<
Vec
<
String
>>
()
.join
(
", "
)
)
}
else
{
String
::
new
()
},
);
err
.span_suggestion_verbose
(
found_span
,
"change the closure to accept a tuple instead of individual arguments"
,
sugg
,
Applicability
::
MachineApplicable
,
);
}
if
let
&
[
ArgKind
::
Tuple
(
_
,
ref
fields
)]
=
&
expected_args
[
..
]
&&
fields
.len
()
==
found_args
.len
()
&&
is_closure
{
let
sugg
=
format!
(
"|({}){}|"
,
found_args
.iter
()
.map
(|
arg
|
match
arg
{
ArgKind
::
Arg
(
name
,
_
)
=>
name
.to_owned
(),
_
=>
"_"
.to_owned
(),
})
.collect
::
<
Vec
<
String
>>
()
.join
(
", "
),
// add type annotations if available
if
found_args
.iter
()
.any
(|
arg
|
match
arg
{
ArgKind
::
Arg
(
_
,
ty
)
=>
ty
!=
"_"
,
_
=>
false
,
})
{
format!
(
": ({})"
,
fields
.iter
()
.map
(|(
_
,
ty
)|
ty
.to_owned
())
.collect
::
<
Vec
<
String
>>
()
.join
(
", "
)
)
}
else
{
String
::
new
()
},
);
err
.span_suggestion_verbose
(
found_span
,
"change the closure to accept a tuple instead of individual arguments"
,
sugg
,
Applicability
::
MachineApplicable
,
);
}
}
...
...
@@ -2231,16 +2232,13 @@ fn is_recursive_obligation(
if
obligated_types
.iter
()
.any
(|
ot
|
ot
==
&
self_ty
)
{
return
true
;
}
if
let
ty
::
Adt
(
def
,
substs
)
=
self_ty
.kind
()
{
if
let
[
arg
]
=
&
substs
[
..
]
{
if
let
ty
::
subst
::
GenericArgKind
::
Type
(
ty
)
=
arg
.unpack
()
{
if
let
ty
::
Adt
(
inner_def
,
_
)
=
ty
.kind
()
{
if
inner_def
==
def
{
return
true
;
}
}
}
}
if
let
ty
::
Adt
(
def
,
substs
)
=
self_ty
.kind
()
&&
let
[
arg
]
=
&
substs
[
..
]
&&
let
ty
::
subst
::
GenericArgKind
::
Type
(
ty
)
=
arg
.unpack
()
&&
let
ty
::
Adt
(
inner_def
,
_
)
=
ty
.kind
()
&&
inner_def
==
def
{
return
true
;
}
}
false
...
...
compiler/rustc_trait_selection/src/traits/error_reporting/suggestions.rs
浏览文件 @
1ff654af
...
...
@@ -891,23 +891,20 @@ fn suggest_remove_await(&self, obligation: &PredicateObligation<'tcx>, err: &mut
}
if
let
Some
(
typeck_results
)
=
self
.in_progress_typeck_results
.map
(|
t
|
t
.borrow
())
&&
let
ty
=
typeck_results
.expr_ty_adjusted
(
base
)
&&
let
ty
::
FnDef
(
def_id
,
_
substs
)
=
ty
.kind
()
&&
let
Some
(
hir
::
Node
::
Item
(
hir
::
Item
{
span
,
ident
,
..
}))
=
hir
.get_if_local
(
*
def_id
)
{
let
ty
=
typeck_results
.expr_ty_adjusted
(
base
);
if
let
ty
::
FnDef
(
def_id
,
_
substs
)
=
ty
.kind
()
{
if
let
Some
(
hir
::
Node
::
Item
(
hir
::
Item
{
span
,
ident
,
..
}))
=
hir
.get_if_local
(
*
def_id
)
{
err
.span_suggestion_verbose
(
span
.shrink_to_lo
(),
&
format!
(
"alternatively, consider making `fn {}` asynchronous"
,
ident
),
"async "
.to_string
(),
Applicability
::
MaybeIncorrect
,
);
}
}
err
.span_suggestion_verbose
(
span
.shrink_to_lo
(),
&
format!
(
"alternatively, consider making `fn {}` asynchronous"
,
ident
),
"async "
.to_string
(),
Applicability
::
MaybeIncorrect
,
);
}
}
}
...
...
@@ -1000,34 +997,24 @@ fn suggest_semicolon_removal(
span
:
Span
,
trait_pred
:
ty
::
PolyTraitPredicate
<
'tcx
>
,
)
{
let
is_empty_tuple
=
|
ty
:
ty
::
Binder
<
'tcx
,
Ty
<
'_
>>
|
*
ty
.skip_binder
()
.kind
()
==
ty
::
Tuple
(
ty
::
List
::
empty
());
let
hir
=
self
.tcx
.hir
();
let
parent_node
=
hir
.get_parent_node
(
obligation
.cause.body_id
);
let
node
=
hir
.find
(
parent_node
);
if
let
Some
(
hir
::
Node
::
Item
(
hir
::
Item
{
kind
:
hir
::
ItemKind
::
Fn
(
sig
,
_
,
body_id
),
..
}))
=
node
if
let
Some
(
hir
::
Node
::
Item
(
hir
::
Item
{
kind
:
hir
::
ItemKind
::
Fn
(
sig
,
_
,
body_id
),
..
}))
=
node
&&
let
body
=
hir
.body
(
*
body_id
)
&&
let
hir
::
ExprKind
::
Block
(
blk
,
_
)
=
&
body
.value.kind
&&
sig
.decl.output
.span
()
.overlaps
(
span
)
&&
blk
.expr
.is_none
()
&&
*
trait_pred
.self_ty
()
.skip_binder
()
.kind
()
==
ty
::
Tuple
(
ty
::
List
::
empty
())
// FIXME(estebank): When encountering a method with a trait
// bound not satisfied in the return type with a body that has
// no return, suggest removal of semicolon on last statement.
// Once that is added, close #54771.
&&
let
Some
(
stmt
)
=
blk
.stmts
.last
()
&&
let
hir
::
StmtKind
::
Semi
(
_
)
=
stmt
.kind
{
let
body
=
hir
.body
(
*
body_id
);
if
let
hir
::
ExprKind
::
Block
(
blk
,
_
)
=
&
body
.value.kind
{
if
sig
.decl.output
.span
()
.overlaps
(
span
)
&&
blk
.expr
.is_none
()
&&
is_empty_tuple
(
trait_pred
.self_ty
())
{
// FIXME(estebank): When encountering a method with a trait
// bound not satisfied in the return type with a body that has
// no return, suggest removal of semicolon on last statement.
// Once that is added, close #54771.
if
let
Some
(
ref
stmt
)
=
blk
.stmts
.last
()
{
if
let
hir
::
StmtKind
::
Semi
(
_
)
=
stmt
.kind
{
let
sp
=
self
.tcx.sess
.source_map
()
.end_point
(
stmt
.span
);
err
.span_label
(
sp
,
"consider removing this semicolon"
);
}
}
}
}
let
sp
=
self
.tcx.sess
.source_map
()
.end_point
(
stmt
.span
);
err
.span_label
(
sp
,
"consider removing this semicolon"
);
}
}
...
...
@@ -2481,17 +2468,15 @@ fn suggest_await_before_try(
debug!
(
"suggest_await_before_try: try_trait_obligation {:?}"
,
try_obligation
);
if
self
.predicate_may_hold
(
&
try_obligation
)
&&
impls_future
.must_apply_modulo_regions
()
&&
let
Ok
(
snippet
)
=
self
.tcx.sess
.source_map
()
.span_to_snippet
(
span
)
&&
snippet
.ends_with
(
'?'
)
{
if
let
Ok
(
snippet
)
=
self
.tcx.sess
.source_map
()
.span_to_snippet
(
span
)
{
if
snippet
.ends_with
(
'?'
)
{
err
.span_suggestion_verbose
(
span
.with_hi
(
span
.hi
()
-
BytePos
(
1
))
.shrink_to_hi
(),
"consider `await`ing on the `Future`"
,
".await"
.to_string
(),
Applicability
::
MaybeIncorrect
,
);
}
}
err
.span_suggestion_verbose
(
span
.with_hi
(
span
.hi
()
-
BytePos
(
1
))
.shrink_to_hi
(),
"consider `await`ing on the `Future`"
,
".await"
.to_string
(),
Applicability
::
MaybeIncorrect
,
);
}
}
}
...
...
compiler/rustc_trait_selection/src/traits/on_unimplemented.rs
浏览文件 @
1ff654af
...
...
@@ -91,10 +91,8 @@ fn parse(
)
})
?
;
attr
::
eval_condition
(
cond
,
&
tcx
.sess.parse_sess
,
Some
(
tcx
.features
()),
&
mut
|
item
|
{
if
let
Some
(
symbol
)
=
item
.value_str
()
{
if
parse_value
(
symbol
)
.is_err
()
{
errored
=
true
;
}
if
let
Some
(
symbol
)
=
item
.value_str
()
&&
parse_value
(
symbol
)
.is_err
()
{
errored
=
true
;
}
true
});
...
...
@@ -232,24 +230,22 @@ pub fn evaluate(
options
.iter
()
.filter_map
(|(
k
,
v
)|
v
.as_ref
()
.map
(|
v
|
(
*
k
,
v
.to_owned
())))
.collect
();
for
command
in
self
.subcommands
.iter
()
.chain
(
Some
(
self
))
.rev
()
{
if
let
Some
(
ref
condition
)
=
command
.condition
{
if
!
attr
::
eval_condition
(
condition
,
&
tcx
.sess.parse_sess
,
Some
(
tcx
.features
()),
&
mut
|
c
|
{
c
.ident
()
.map_or
(
false
,
|
ident
|
{
let
value
=
c
.value_str
()
.map
(|
s
|
{
OnUnimplementedFormatString
(
s
)
.format
(
tcx
,
trait_ref
,
&
options_map
)
});
if
let
Some
(
ref
condition
)
=
command
.condition
&&
!
attr
::
eval_condition
(
condition
,
&
tcx
.sess.parse_sess
,
Some
(
tcx
.features
()),
&
mut
|
c
|
{
c
.ident
()
.map_or
(
false
,
|
ident
|
{
let
value
=
c
.value_str
()
.map
(|
s
|
{
OnUnimplementedFormatString
(
s
)
.format
(
tcx
,
trait_ref
,
&
options_map
)
});
options
.contains
(
&
(
ident
.name
,
value
))
})
},
)
{
debug!
(
"evaluate: skipping {:?} due to condition"
,
command
);
continue
;
}
options
.contains
(
&
(
ident
.name
,
value
))
})
},
)
{
debug!
(
"evaluate: skipping {:?} due to condition"
,
command
);
continue
;
}
debug!
(
"evaluate: {:?} succeeded"
,
command
);
if
let
Some
(
ref
message_
)
=
command
.message
{
...
...
compiler/rustc_trait_selection/src/traits/query/dropck_outlives.rs
浏览文件 @
1ff654af
...
...
@@ -43,21 +43,19 @@ fn dropck_outlives(&self, ty: Ty<'tcx>) -> InferOk<'tcx, Vec<GenericArg<'tcx>>>
let
c_ty
=
self
.infcx
.canonicalize_query
(
self
.param_env
.and
(
ty
),
&
mut
orig_values
);
let
span
=
self
.cause.span
;
debug!
(
"c_ty = {:?}"
,
c_ty
);
if
let
Ok
(
result
)
=
tcx
.dropck_outlives
(
c_ty
)
{
if
result
.is_proven
()
{
if
let
Ok
(
InferOk
{
value
,
obligations
})
=
self
.infcx
.instantiate_query_response_and_region_obligations
(
self
.cause
,
self
.param_env
,
&
orig_values
,
result
,
)
{
let
ty
=
self
.infcx
.resolve_vars_if_possible
(
ty
);
let
kinds
=
value
.into_kinds_reporting_overflows
(
tcx
,
span
,
ty
);
return
InferOk
{
value
:
kinds
,
obligations
};
}
}
if
let
Ok
(
result
)
=
tcx
.dropck_outlives
(
c_ty
)
&&
result
.is_proven
()
&&
let
Ok
(
InferOk
{
value
,
obligations
})
=
self
.infcx
.instantiate_query_response_and_region_obligations
(
self
.cause
,
self
.param_env
,
&
orig_values
,
result
,
)
{
let
ty
=
self
.infcx
.resolve_vars_if_possible
(
ty
);
let
kinds
=
value
.into_kinds_reporting_overflows
(
tcx
,
span
,
ty
);
return
InferOk
{
value
:
kinds
,
obligations
};
}
// Errors and ambiuity in dropck occur in two cases:
...
...
compiler/rustc_trait_selection/src/traits/relationships.rs
浏览文件 @
1ff654af
...
...
@@ -12,50 +12,38 @@ pub(crate) fn update<'tcx, T>(
T
:
TraitEngine
<
'tcx
>
,
{
// (*) binder skipped
if
let
ty
::
PredicateKind
::
Trait
(
predicate
)
=
obligation
.predicate
.kind
()
.skip_binder
()
{
if
let
Some
(
ty
)
=
infcx
.shallow_resolve
(
predicate
.self_ty
())
.ty_vid
()
.map
(|
t
|
infcx
.root_var
(
t
))
{
if
infcx
.tcx
.lang_items
()
.sized_trait
()
.map_or
(
false
,
|
st
|
st
!=
predicate
.trait_ref.def_id
)
{
let
new_self_ty
=
infcx
.tcx.types.unit
;
if
let
ty
::
PredicateKind
::
Trait
(
tpred
)
=
obligation
.predicate
.kind
()
.skip_binder
()
&&
let
Some
(
ty
)
=
infcx
.shallow_resolve
(
tpred
.self_ty
())
.ty_vid
()
.map
(|
t
|
infcx
.root_var
(
t
))
&&
infcx
.tcx
.lang_items
()
.sized_trait
()
.map_or
(
false
,
|
st
|
st
!=
tpred
.trait_ref.def_id
)
{
let
new_self_ty
=
infcx
.tcx.types.unit
;
let
trait_ref
=
ty
::
TraitRef
{
substs
:
infcx
.tcx
.mk_substs_trait
(
new_self_ty
,
&
predicate
.trait_ref.substs
[
1
..
]),
..
predicate
.trait_ref
};
let
trait_ref
=
ty
::
TraitRef
{
substs
:
infcx
.tcx
.mk_substs_trait
(
new_self_ty
,
&
tpred
.trait_ref.substs
[
1
..
]),
..
tpred
.trait_ref
};
// Then contstruct a new obligation with Self = () added
// to the ParamEnv, and see if it holds.
let
o
=
rustc_infer
::
traits
::
Obligation
::
new
(
ObligationCause
::
dummy
(),
obligation
.param_env
,
obligation
.predicate
.kind
()
.map_bound
(|
_
|
{
// (*) binder moved here
ty
::
PredicateKind
::
Trait
(
ty
::
TraitPredicate
{
trait_ref
,
constness
:
predicate
.constness
,
polarity
:
predicate
.polarity
,
})
})
.to_predicate
(
infcx
.tcx
),
);
// Don't report overflow errors. Otherwise equivalent to may_hold.
if
let
Ok
(
result
)
=
infcx
.probe
(|
_
|
infcx
.evaluate_obligation
(
&
o
))
{
if
result
.may_apply
()
{
engine
.relationships
()
.entry
(
ty
)
.or_default
()
.self_in_trait
=
true
;
}
}
}
// Then contstruct a new obligation with Self = () added
// to the ParamEnv, and see if it holds.
let
o
=
rustc_infer
::
traits
::
Obligation
::
new
(
ObligationCause
::
dummy
(),
obligation
.param_env
,
obligation
.predicate
.kind
()
.map_bound
(|
_
|
{
// (*) binder moved here
ty
::
PredicateKind
::
Trait
(
ty
::
TraitPredicate
{
trait_ref
,
constness
:
tpred
.constness
,
polarity
:
tpred
.polarity
,
})
})
.to_predicate
(
infcx
.tcx
),
);
// Don't report overflow errors. Otherwise equivalent to may_hold.
if
let
Ok
(
result
)
=
infcx
.probe
(|
_
|
infcx
.evaluate_obligation
(
&
o
))
&&
result
.may_apply
()
{
engine
.relationships
()
.entry
(
ty
)
.or_default
()
.self_in_trait
=
true
;
}
}
...
...
compiler/rustc_trait_selection/src/traits/select/mod.rs
浏览文件 @
1ff654af
...
...
@@ -579,24 +579,22 @@ fn evaluate_predicate_recursively<'o>(
previous_stack
,
subobligations
,
);
if
let
Ok
(
res
)
=
res
{
if
res
==
EvaluatedToOk
||
res
==
EvaluatedToOkModuloRegions
{
if
let
Some
(
key
)
=
ProjectionCacheKey
::
from_poly_projection_predicate
(
self
,
data
,
)
{
// If the result is something that we can cache, then mark this
// entry as 'complete'. This will allow us to skip evaluating the
// suboligations at all the next time we evaluate the projection
// predicate.
self
.infcx
.inner
.borrow_mut
()
.projection_cache
()
.complete
(
key
,
res
);
}
}
if
let
Ok
(
eval_rslt
)
=
res
&&
(
eval_rslt
==
EvaluatedToOk
||
eval_rslt
==
EvaluatedToOkModuloRegions
)
&&
let
Some
(
key
)
=
ProjectionCacheKey
::
from_poly_projection_predicate
(
self
,
data
,
)
{
// If the result is something that we can cache, then mark this
// entry as 'complete'. This will allow us to skip evaluating the
// suboligations at all the next time we evaluate the projection
// predicate.
self
.infcx
.inner
.borrow_mut
()
.projection_cache
()
.complete
(
key
,
eval_rslt
);
}
res
}
...
...
compiler/rustc_trait_selection/src/traits/wf.rs
浏览文件 @
1ff654af
...
...
@@ -224,36 +224,30 @@ fn extend_cause_with_original_assoc_item_obligation<'tcx>(
// projection coming from another associated type. See
// `src/test/ui/associated-types/point-at-type-on-obligation-failure.rs` and
// `traits-assoc-type-in-supertrait-bad.rs`.
if
let
Some
(
ty
::
Projection
(
projection_ty
))
=
proj
.term
.ty
()
.map
(|
ty
|
ty
.kind
())
{
if
let
Some
(
&
impl_item_id
)
=
if
let
Some
(
ty
::
Projection
(
projection_ty
))
=
proj
.term
.ty
()
.map
(|
ty
|
ty
.kind
())
&&
let
Some
(
&
impl_item_id
)
=
tcx
.impl_item_implementor_ids
(
impl_def_id
)
.get
(
&
projection_ty
.item_def_id
)
{
if
let
Some
(
impl_item_span
)
=
items
.iter
()
.find
(|
item
|
item
.id.def_id
.to_def_id
()
==
impl_item_id
)
.map
(
fix_span
)
{
cause
.span
=
impl_item_span
;
}
}
&&
let
Some
(
impl_item_span
)
=
items
.iter
()
.find
(|
item
|
item
.id.def_id
.to_def_id
()
==
impl_item_id
)
.map
(
fix_span
)
{
cause
.span
=
impl_item_span
;
}
}
ty
::
PredicateKind
::
Trait
(
pred
)
=>
{
// An associated item obligation born out of the `trait` failed to be met. An example
// can be seen in `ui/associated-types/point-at-type-on-obligation-failure-2.rs`.
debug!
(
"extended_cause_with_original_assoc_item_obligation trait proj {:?}"
,
pred
);
if
let
ty
::
Projection
(
ty
::
ProjectionTy
{
item_def_id
,
..
})
=
*
pred
.self_ty
()
.kind
()
{
if
let
Some
(
&
impl_item_id
)
=
if
let
ty
::
Projection
(
ty
::
ProjectionTy
{
item_def_id
,
..
})
=
*
pred
.self_ty
()
.kind
()
&&
let
Some
(
&
impl_item_id
)
=
tcx
.impl_item_implementor_ids
(
impl_def_id
)
.get
(
&
item_def_id
)
{
if
let
Some
(
impl_item_span
)
=
items
.iter
()
.find
(|
item
|
item
.id.def_id
.to_def_id
()
==
impl_item_id
)
.map
(
fix_span
)
{
cause
.span
=
impl_item_span
;
}
}
&&
let
Some
(
impl_item_span
)
=
items
.iter
()
.find
(|
item
|
item
.id.def_id
.to_def_id
()
==
impl_item_id
)
.map
(
fix_span
)
{
cause
.span
=
impl_item_span
;
}
}
_
=>
{}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录