Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
f66c06f7
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,发现更多精彩内容 >>
未验证
提交
f66c06f7
编写于
6月 17, 2022
作者:
A
Alan Egerton
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Explicit TypeVisitable implementations
上级
9ffdc2de
变更
7
隐藏空白更改
内联
并排
Showing
7 changed file
with
269 addition
and
152 deletion
+269
-152
compiler/rustc_infer/src/traits/structural_impls.rs
compiler/rustc_infer/src/traits/structural_impls.rs
+3
-0
compiler/rustc_middle/src/mir/mod.rs
compiler/rustc_middle/src/mir/mod.rs
+4
-0
compiler/rustc_middle/src/mir/type_foldable.rs
compiler/rustc_middle/src/mir/type_foldable.rs
+0
-152
compiler/rustc_middle/src/mir/type_visitable.rs
compiler/rustc_middle/src/mir/type_visitable.rs
+186
-0
compiler/rustc_middle/src/ty/mod.rs
compiler/rustc_middle/src/ty/mod.rs
+2
-0
compiler/rustc_middle/src/ty/structural_impls.rs
compiler/rustc_middle/src/ty/structural_impls.rs
+67
-0
compiler/rustc_middle/src/ty/subst.rs
compiler/rustc_middle/src/ty/subst.rs
+7
-0
未找到文件。
compiler/rustc_infer/src/traits/structural_impls.rs
浏览文件 @
f66c06f7
...
...
@@ -2,6 +2,7 @@
use
crate
::
traits
::
project
::
Normalized
;
use
rustc_middle
::
ty
;
use
rustc_middle
::
ty
::
fold
::{
FallibleTypeFolder
,
TypeFoldable
,
TypeVisitor
};
use
rustc_middle
::
ty
::
visit
::
TypeVisitable
;
use
std
::
fmt
;
use
std
::
ops
::
ControlFlow
;
...
...
@@ -68,7 +69,9 @@ fn try_fold_with<F: FallibleTypeFolder<'tcx>>(self, folder: &mut F) -> Result<Se
param_env
:
self
.param_env
.try_fold_with
(
folder
)
?
,
})
}
}
impl
<
'tcx
,
O
:
TypeVisitable
<
'tcx
>>
TypeVisitable
<
'tcx
>
for
traits
::
Obligation
<
'tcx
,
O
>
{
fn
visit_with
<
V
:
TypeVisitor
<
'tcx
>>
(
&
self
,
visitor
:
&
mut
V
)
->
ControlFlow
<
V
::
BreakTy
>
{
self
.predicate
.visit_with
(
visitor
)
?
;
self
.param_env
.visit_with
(
visitor
)
...
...
compiler/rustc_middle/src/mir/mod.rs
浏览文件 @
f66c06f7
...
...
@@ -11,6 +11,7 @@
use
crate
::
ty
::
fold
::{
FallibleTypeFolder
,
TypeFoldable
,
TypeSuperFoldable
,
TypeVisitor
};
use
crate
::
ty
::
print
::{
FmtPrinter
,
Printer
};
use
crate
::
ty
::
subst
::{
GenericArg
,
InternalSubsts
,
Subst
,
SubstsRef
};
use
crate
::
ty
::
visit
::
TypeVisitable
;
use
crate
::
ty
::{
self
,
List
,
Ty
,
TyCtxt
};
use
crate
::
ty
::{
AdtDef
,
InstanceDef
,
ScalarInt
,
UserTypeAnnotationIndex
};
...
...
@@ -68,6 +69,7 @@
pub
mod
traversal
;
mod
type_foldable
;
mod
type_visitable
;
pub
mod
visit
;
pub
use
self
::
generic_graph
::
graphviz_safe_def_name
;
...
...
@@ -2650,7 +2652,9 @@ fn try_fold_with<F: FallibleTypeFolder<'tcx>>(self, folder: &mut F) -> Result<Se
projs
:
self
.projs
.try_fold_with
(
folder
)
?
,
})
}
}
impl
<
'tcx
>
TypeVisitable
<
'tcx
>
for
UserTypeProjection
{
fn
visit_with
<
Vs
:
TypeVisitor
<
'tcx
>>
(
&
self
,
visitor
:
&
mut
Vs
)
->
ControlFlow
<
Vs
::
BreakTy
>
{
self
.base
.visit_with
(
visitor
)
// Note: there's nothing in `self.proj` to visit.
...
...
compiler/rustc_middle/src/mir/type_foldable.rs
浏览文件 @
f66c06f7
...
...
@@ -89,65 +89,12 @@ fn try_fold_with<F: FallibleTypeFolder<'tcx>>(self, folder: &mut F) -> Result<Se
};
Ok
(
Terminator
{
source_info
:
self
.source_info
,
kind
})
}
fn
visit_with
<
V
:
TypeVisitor
<
'tcx
>>
(
&
self
,
visitor
:
&
mut
V
)
->
ControlFlow
<
V
::
BreakTy
>
{
use
crate
::
mir
::
TerminatorKind
::
*
;
match
self
.kind
{
SwitchInt
{
ref
discr
,
switch_ty
,
..
}
=>
{
discr
.visit_with
(
visitor
)
?
;
switch_ty
.visit_with
(
visitor
)
}
Drop
{
ref
place
,
..
}
=>
place
.visit_with
(
visitor
),
DropAndReplace
{
ref
place
,
ref
value
,
..
}
=>
{
place
.visit_with
(
visitor
)
?
;
value
.visit_with
(
visitor
)
}
Yield
{
ref
value
,
..
}
=>
value
.visit_with
(
visitor
),
Call
{
ref
func
,
ref
args
,
ref
destination
,
..
}
=>
{
destination
.visit_with
(
visitor
)
?
;
func
.visit_with
(
visitor
)
?
;
args
.visit_with
(
visitor
)
}
Assert
{
ref
cond
,
ref
msg
,
..
}
=>
{
cond
.visit_with
(
visitor
)
?
;
use
AssertKind
::
*
;
match
msg
{
BoundsCheck
{
ref
len
,
ref
index
}
=>
{
len
.visit_with
(
visitor
)
?
;
index
.visit_with
(
visitor
)
}
Overflow
(
_
,
l
,
r
)
=>
{
l
.visit_with
(
visitor
)
?
;
r
.visit_with
(
visitor
)
}
OverflowNeg
(
op
)
|
DivisionByZero
(
op
)
|
RemainderByZero
(
op
)
=>
{
op
.visit_with
(
visitor
)
}
ResumedAfterReturn
(
_
)
|
ResumedAfterPanic
(
_
)
=>
ControlFlow
::
CONTINUE
,
}
}
InlineAsm
{
ref
operands
,
..
}
=>
operands
.visit_with
(
visitor
),
Goto
{
..
}
|
Resume
|
Abort
|
Return
|
GeneratorDrop
|
Unreachable
|
FalseEdge
{
..
}
|
FalseUnwind
{
..
}
=>
ControlFlow
::
CONTINUE
,
}
}
}
impl
<
'tcx
>
TypeFoldable
<
'tcx
>
for
GeneratorKind
{
fn
try_fold_with
<
F
:
FallibleTypeFolder
<
'tcx
>>
(
self
,
_
:
&
mut
F
)
->
Result
<
Self
,
F
::
Error
>
{
Ok
(
self
)
}
fn
visit_with
<
V
:
TypeVisitor
<
'tcx
>>
(
&
self
,
_
:
&
mut
V
)
->
ControlFlow
<
V
::
BreakTy
>
{
ControlFlow
::
CONTINUE
}
}
impl
<
'tcx
>
TypeFoldable
<
'tcx
>
for
Place
<
'tcx
>
{
...
...
@@ -157,21 +104,12 @@ fn try_fold_with<F: FallibleTypeFolder<'tcx>>(self, folder: &mut F) -> Result<Se
projection
:
self
.projection
.try_fold_with
(
folder
)
?
,
})
}
fn
visit_with
<
V
:
TypeVisitor
<
'tcx
>>
(
&
self
,
visitor
:
&
mut
V
)
->
ControlFlow
<
V
::
BreakTy
>
{
self
.local
.visit_with
(
visitor
)
?
;
self
.projection
.visit_with
(
visitor
)
}
}
impl
<
'tcx
>
TypeFoldable
<
'tcx
>
for
&
'tcx
ty
::
List
<
PlaceElem
<
'tcx
>>
{
fn
try_fold_with
<
F
:
FallibleTypeFolder
<
'tcx
>>
(
self
,
folder
:
&
mut
F
)
->
Result
<
Self
,
F
::
Error
>
{
ty
::
util
::
fold_list
(
self
,
folder
,
|
tcx
,
v
|
tcx
.intern_place_elems
(
v
))
}
fn
visit_with
<
V
:
TypeVisitor
<
'tcx
>>
(
&
self
,
visitor
:
&
mut
V
)
->
ControlFlow
<
V
::
BreakTy
>
{
self
.iter
()
.try_for_each
(|
t
|
t
.visit_with
(
visitor
))
}
}
impl
<
'tcx
>
TypeFoldable
<
'tcx
>
for
Rvalue
<
'tcx
>
{
...
...
@@ -224,55 +162,6 @@ fn try_fold_with<F: FallibleTypeFolder<'tcx>>(self, folder: &mut F) -> Result<Se
}
})
}
fn
visit_with
<
V
:
TypeVisitor
<
'tcx
>>
(
&
self
,
visitor
:
&
mut
V
)
->
ControlFlow
<
V
::
BreakTy
>
{
use
crate
::
mir
::
Rvalue
::
*
;
match
*
self
{
Use
(
ref
op
)
=>
op
.visit_with
(
visitor
),
Repeat
(
ref
op
,
_
)
=>
op
.visit_with
(
visitor
),
ThreadLocalRef
(
did
)
=>
did
.visit_with
(
visitor
),
Ref
(
region
,
_
,
ref
place
)
=>
{
region
.visit_with
(
visitor
)
?
;
place
.visit_with
(
visitor
)
}
AddressOf
(
_
,
ref
place
)
=>
place
.visit_with
(
visitor
),
Len
(
ref
place
)
=>
place
.visit_with
(
visitor
),
Cast
(
_
,
ref
op
,
ty
)
=>
{
op
.visit_with
(
visitor
)
?
;
ty
.visit_with
(
visitor
)
}
BinaryOp
(
_
,
box
(
ref
rhs
,
ref
lhs
))
|
CheckedBinaryOp
(
_
,
box
(
ref
rhs
,
ref
lhs
))
=>
{
rhs
.visit_with
(
visitor
)
?
;
lhs
.visit_with
(
visitor
)
}
UnaryOp
(
_
,
ref
val
)
=>
val
.visit_with
(
visitor
),
Discriminant
(
ref
place
)
=>
place
.visit_with
(
visitor
),
NullaryOp
(
_
,
ty
)
=>
ty
.visit_with
(
visitor
),
Aggregate
(
ref
kind
,
ref
fields
)
=>
{
match
**
kind
{
AggregateKind
::
Array
(
ty
)
=>
{
ty
.visit_with
(
visitor
)
?
;
}
AggregateKind
::
Tuple
=>
{}
AggregateKind
::
Adt
(
_
,
_
,
substs
,
user_ty
,
_
)
=>
{
substs
.visit_with
(
visitor
)
?
;
user_ty
.visit_with
(
visitor
)
?
;
}
AggregateKind
::
Closure
(
_
,
substs
)
=>
{
substs
.visit_with
(
visitor
)
?
;
}
AggregateKind
::
Generator
(
_
,
substs
,
_
)
=>
{
substs
.visit_with
(
visitor
)
?
;
}
}
fields
.visit_with
(
visitor
)
}
ShallowInitBox
(
ref
op
,
ty
)
=>
{
op
.visit_with
(
visitor
)
?
;
ty
.visit_with
(
visitor
)
}
}
}
}
impl
<
'tcx
>
TypeFoldable
<
'tcx
>
for
Operand
<
'tcx
>
{
...
...
@@ -283,13 +172,6 @@ fn try_fold_with<F: FallibleTypeFolder<'tcx>>(self, folder: &mut F) -> Result<Se
Operand
::
Constant
(
c
)
=>
Operand
::
Constant
(
c
.try_fold_with
(
folder
)
?
),
})
}
fn
visit_with
<
V
:
TypeVisitor
<
'tcx
>>
(
&
self
,
visitor
:
&
mut
V
)
->
ControlFlow
<
V
::
BreakTy
>
{
match
*
self
{
Operand
::
Copy
(
ref
place
)
|
Operand
::
Move
(
ref
place
)
=>
place
.visit_with
(
visitor
),
Operand
::
Constant
(
ref
c
)
=>
c
.visit_with
(
visitor
),
}
}
}
impl
<
'tcx
>
TypeFoldable
<
'tcx
>
for
PlaceElem
<
'tcx
>
{
...
...
@@ -307,43 +189,24 @@ fn try_fold_with<F: FallibleTypeFolder<'tcx>>(self, folder: &mut F) -> Result<Se
Subslice
{
from
,
to
,
from_end
}
=>
Subslice
{
from
,
to
,
from_end
},
})
}
fn
visit_with
<
Vs
:
TypeVisitor
<
'tcx
>>
(
&
self
,
visitor
:
&
mut
Vs
)
->
ControlFlow
<
Vs
::
BreakTy
>
{
use
crate
::
mir
::
ProjectionElem
::
*
;
match
self
{
Field
(
_
,
ty
)
=>
ty
.visit_with
(
visitor
),
Index
(
v
)
=>
v
.visit_with
(
visitor
),
_
=>
ControlFlow
::
CONTINUE
,
}
}
}
impl
<
'tcx
>
TypeFoldable
<
'tcx
>
for
Field
{
fn
try_fold_with
<
F
:
FallibleTypeFolder
<
'tcx
>>
(
self
,
_
:
&
mut
F
)
->
Result
<
Self
,
F
::
Error
>
{
Ok
(
self
)
}
fn
visit_with
<
V
:
TypeVisitor
<
'tcx
>>
(
&
self
,
_
:
&
mut
V
)
->
ControlFlow
<
V
::
BreakTy
>
{
ControlFlow
::
CONTINUE
}
}
impl
<
'tcx
>
TypeFoldable
<
'tcx
>
for
GeneratorSavedLocal
{
fn
try_fold_with
<
F
:
FallibleTypeFolder
<
'tcx
>>
(
self
,
_
:
&
mut
F
)
->
Result
<
Self
,
F
::
Error
>
{
Ok
(
self
)
}
fn
visit_with
<
V
:
TypeVisitor
<
'tcx
>>
(
&
self
,
_
:
&
mut
V
)
->
ControlFlow
<
V
::
BreakTy
>
{
ControlFlow
::
CONTINUE
}
}
impl
<
'tcx
,
R
:
Idx
,
C
:
Idx
>
TypeFoldable
<
'tcx
>
for
BitMatrix
<
R
,
C
>
{
fn
try_fold_with
<
F
:
FallibleTypeFolder
<
'tcx
>>
(
self
,
_
:
&
mut
F
)
->
Result
<
Self
,
F
::
Error
>
{
Ok
(
self
)
}
fn
visit_with
<
V
:
TypeVisitor
<
'tcx
>>
(
&
self
,
_
:
&
mut
V
)
->
ControlFlow
<
V
::
BreakTy
>
{
ControlFlow
::
CONTINUE
}
}
impl
<
'tcx
>
TypeFoldable
<
'tcx
>
for
Constant
<
'tcx
>
{
...
...
@@ -354,10 +217,6 @@ fn try_fold_with<F: FallibleTypeFolder<'tcx>>(self, folder: &mut F) -> Result<Se
literal
:
self
.literal
.try_fold_with
(
folder
)
?
,
})
}
fn
visit_with
<
V
:
TypeVisitor
<
'tcx
>>
(
&
self
,
visitor
:
&
mut
V
)
->
ControlFlow
<
V
::
BreakTy
>
{
self
.literal
.visit_with
(
visitor
)
?
;
self
.user_ty
.visit_with
(
visitor
)
}
}
impl
<
'tcx
>
TypeFoldable
<
'tcx
>
for
ConstantKind
<
'tcx
>
{
...
...
@@ -365,10 +224,6 @@ impl<'tcx> TypeFoldable<'tcx> for ConstantKind<'tcx> {
fn
try_fold_with
<
F
:
FallibleTypeFolder
<
'tcx
>>
(
self
,
folder
:
&
mut
F
)
->
Result
<
Self
,
F
::
Error
>
{
folder
.try_fold_mir_const
(
self
)
}
fn
visit_with
<
V
:
TypeVisitor
<
'tcx
>>
(
&
self
,
visitor
:
&
mut
V
)
->
ControlFlow
<
V
::
BreakTy
>
{
visitor
.visit_mir_const
(
*
self
)
}
}
impl
<
'tcx
>
TypeSuperFoldable
<
'tcx
>
for
ConstantKind
<
'tcx
>
{
...
...
@@ -381,11 +236,4 @@ fn try_super_fold_with<F: FallibleTypeFolder<'tcx>>(
ConstantKind
::
Val
(
v
,
t
)
=>
Ok
(
ConstantKind
::
Val
(
v
,
t
.try_fold_with
(
folder
)
?
)),
}
}
fn
super_visit_with
<
V
:
TypeVisitor
<
'tcx
>>
(
&
self
,
visitor
:
&
mut
V
)
->
ControlFlow
<
V
::
BreakTy
>
{
match
*
self
{
ConstantKind
::
Ty
(
c
)
=>
c
.visit_with
(
visitor
),
ConstantKind
::
Val
(
_
,
t
)
=>
t
.visit_with
(
visitor
),
}
}
}
compiler/rustc_middle/src/mir/type_visitable.rs
0 → 100644
浏览文件 @
f66c06f7
//! `TypeVisitable` implementations for MIR types
use
super
::
*
;
use
crate
::
ty
;
impl
<
'tcx
>
TypeVisitable
<
'tcx
>
for
Terminator
<
'tcx
>
{
fn
visit_with
<
V
:
TypeVisitor
<
'tcx
>>
(
&
self
,
visitor
:
&
mut
V
)
->
ControlFlow
<
V
::
BreakTy
>
{
use
crate
::
mir
::
TerminatorKind
::
*
;
match
self
.kind
{
SwitchInt
{
ref
discr
,
switch_ty
,
..
}
=>
{
discr
.visit_with
(
visitor
)
?
;
switch_ty
.visit_with
(
visitor
)
}
Drop
{
ref
place
,
..
}
=>
place
.visit_with
(
visitor
),
DropAndReplace
{
ref
place
,
ref
value
,
..
}
=>
{
place
.visit_with
(
visitor
)
?
;
value
.visit_with
(
visitor
)
}
Yield
{
ref
value
,
..
}
=>
value
.visit_with
(
visitor
),
Call
{
ref
func
,
ref
args
,
ref
destination
,
..
}
=>
{
destination
.visit_with
(
visitor
)
?
;
func
.visit_with
(
visitor
)
?
;
args
.visit_with
(
visitor
)
}
Assert
{
ref
cond
,
ref
msg
,
..
}
=>
{
cond
.visit_with
(
visitor
)
?
;
use
AssertKind
::
*
;
match
msg
{
BoundsCheck
{
ref
len
,
ref
index
}
=>
{
len
.visit_with
(
visitor
)
?
;
index
.visit_with
(
visitor
)
}
Overflow
(
_
,
l
,
r
)
=>
{
l
.visit_with
(
visitor
)
?
;
r
.visit_with
(
visitor
)
}
OverflowNeg
(
op
)
|
DivisionByZero
(
op
)
|
RemainderByZero
(
op
)
=>
{
op
.visit_with
(
visitor
)
}
ResumedAfterReturn
(
_
)
|
ResumedAfterPanic
(
_
)
=>
ControlFlow
::
CONTINUE
,
}
}
InlineAsm
{
ref
operands
,
..
}
=>
operands
.visit_with
(
visitor
),
Goto
{
..
}
|
Resume
|
Abort
|
Return
|
GeneratorDrop
|
Unreachable
|
FalseEdge
{
..
}
|
FalseUnwind
{
..
}
=>
ControlFlow
::
CONTINUE
,
}
}
}
impl
<
'tcx
>
TypeVisitable
<
'tcx
>
for
GeneratorKind
{
fn
visit_with
<
V
:
TypeVisitor
<
'tcx
>>
(
&
self
,
_
:
&
mut
V
)
->
ControlFlow
<
V
::
BreakTy
>
{
ControlFlow
::
CONTINUE
}
}
impl
<
'tcx
>
TypeVisitable
<
'tcx
>
for
Place
<
'tcx
>
{
fn
visit_with
<
V
:
TypeVisitor
<
'tcx
>>
(
&
self
,
visitor
:
&
mut
V
)
->
ControlFlow
<
V
::
BreakTy
>
{
self
.local
.visit_with
(
visitor
)
?
;
self
.projection
.visit_with
(
visitor
)
}
}
impl
<
'tcx
>
TypeVisitable
<
'tcx
>
for
&
'tcx
ty
::
List
<
PlaceElem
<
'tcx
>>
{
fn
visit_with
<
V
:
TypeVisitor
<
'tcx
>>
(
&
self
,
visitor
:
&
mut
V
)
->
ControlFlow
<
V
::
BreakTy
>
{
self
.iter
()
.try_for_each
(|
t
|
t
.visit_with
(
visitor
))
}
}
impl
<
'tcx
>
TypeVisitable
<
'tcx
>
for
Rvalue
<
'tcx
>
{
fn
visit_with
<
V
:
TypeVisitor
<
'tcx
>>
(
&
self
,
visitor
:
&
mut
V
)
->
ControlFlow
<
V
::
BreakTy
>
{
use
crate
::
mir
::
Rvalue
::
*
;
match
*
self
{
Use
(
ref
op
)
=>
op
.visit_with
(
visitor
),
Repeat
(
ref
op
,
_
)
=>
op
.visit_with
(
visitor
),
ThreadLocalRef
(
did
)
=>
did
.visit_with
(
visitor
),
Ref
(
region
,
_
,
ref
place
)
=>
{
region
.visit_with
(
visitor
)
?
;
place
.visit_with
(
visitor
)
}
AddressOf
(
_
,
ref
place
)
=>
place
.visit_with
(
visitor
),
Len
(
ref
place
)
=>
place
.visit_with
(
visitor
),
Cast
(
_
,
ref
op
,
ty
)
=>
{
op
.visit_with
(
visitor
)
?
;
ty
.visit_with
(
visitor
)
}
BinaryOp
(
_
,
box
(
ref
rhs
,
ref
lhs
))
|
CheckedBinaryOp
(
_
,
box
(
ref
rhs
,
ref
lhs
))
=>
{
rhs
.visit_with
(
visitor
)
?
;
lhs
.visit_with
(
visitor
)
}
UnaryOp
(
_
,
ref
val
)
=>
val
.visit_with
(
visitor
),
Discriminant
(
ref
place
)
=>
place
.visit_with
(
visitor
),
NullaryOp
(
_
,
ty
)
=>
ty
.visit_with
(
visitor
),
Aggregate
(
ref
kind
,
ref
fields
)
=>
{
match
**
kind
{
AggregateKind
::
Array
(
ty
)
=>
{
ty
.visit_with
(
visitor
)
?
;
}
AggregateKind
::
Tuple
=>
{}
AggregateKind
::
Adt
(
_
,
_
,
substs
,
user_ty
,
_
)
=>
{
substs
.visit_with
(
visitor
)
?
;
user_ty
.visit_with
(
visitor
)
?
;
}
AggregateKind
::
Closure
(
_
,
substs
)
=>
{
substs
.visit_with
(
visitor
)
?
;
}
AggregateKind
::
Generator
(
_
,
substs
,
_
)
=>
{
substs
.visit_with
(
visitor
)
?
;
}
}
fields
.visit_with
(
visitor
)
}
ShallowInitBox
(
ref
op
,
ty
)
=>
{
op
.visit_with
(
visitor
)
?
;
ty
.visit_with
(
visitor
)
}
}
}
}
impl
<
'tcx
>
TypeVisitable
<
'tcx
>
for
Operand
<
'tcx
>
{
fn
visit_with
<
V
:
TypeVisitor
<
'tcx
>>
(
&
self
,
visitor
:
&
mut
V
)
->
ControlFlow
<
V
::
BreakTy
>
{
match
*
self
{
Operand
::
Copy
(
ref
place
)
|
Operand
::
Move
(
ref
place
)
=>
place
.visit_with
(
visitor
),
Operand
::
Constant
(
ref
c
)
=>
c
.visit_with
(
visitor
),
}
}
}
impl
<
'tcx
>
TypeVisitable
<
'tcx
>
for
PlaceElem
<
'tcx
>
{
fn
visit_with
<
Vs
:
TypeVisitor
<
'tcx
>>
(
&
self
,
visitor
:
&
mut
Vs
)
->
ControlFlow
<
Vs
::
BreakTy
>
{
use
crate
::
mir
::
ProjectionElem
::
*
;
match
self
{
Field
(
_
,
ty
)
=>
ty
.visit_with
(
visitor
),
Index
(
v
)
=>
v
.visit_with
(
visitor
),
_
=>
ControlFlow
::
CONTINUE
,
}
}
}
impl
<
'tcx
>
TypeVisitable
<
'tcx
>
for
Field
{
fn
visit_with
<
V
:
TypeVisitor
<
'tcx
>>
(
&
self
,
_
:
&
mut
V
)
->
ControlFlow
<
V
::
BreakTy
>
{
ControlFlow
::
CONTINUE
}
}
impl
<
'tcx
>
TypeVisitable
<
'tcx
>
for
GeneratorSavedLocal
{
fn
visit_with
<
V
:
TypeVisitor
<
'tcx
>>
(
&
self
,
_
:
&
mut
V
)
->
ControlFlow
<
V
::
BreakTy
>
{
ControlFlow
::
CONTINUE
}
}
impl
<
'tcx
,
R
:
Idx
,
C
:
Idx
>
TypeVisitable
<
'tcx
>
for
BitMatrix
<
R
,
C
>
{
fn
visit_with
<
V
:
TypeVisitor
<
'tcx
>>
(
&
self
,
_
:
&
mut
V
)
->
ControlFlow
<
V
::
BreakTy
>
{
ControlFlow
::
CONTINUE
}
}
impl
<
'tcx
>
TypeVisitable
<
'tcx
>
for
Constant
<
'tcx
>
{
fn
visit_with
<
V
:
TypeVisitor
<
'tcx
>>
(
&
self
,
visitor
:
&
mut
V
)
->
ControlFlow
<
V
::
BreakTy
>
{
self
.literal
.visit_with
(
visitor
)
?
;
self
.user_ty
.visit_with
(
visitor
)
}
}
impl
<
'tcx
>
TypeVisitable
<
'tcx
>
for
ConstantKind
<
'tcx
>
{
fn
visit_with
<
V
:
TypeVisitor
<
'tcx
>>
(
&
self
,
visitor
:
&
mut
V
)
->
ControlFlow
<
V
::
BreakTy
>
{
visitor
.visit_mir_const
(
*
self
)
}
}
impl
<
'tcx
>
TypeSuperVisitable
<
'tcx
>
for
ConstantKind
<
'tcx
>
{
fn
super_visit_with
<
V
:
TypeVisitor
<
'tcx
>>
(
&
self
,
visitor
:
&
mut
V
)
->
ControlFlow
<
V
::
BreakTy
>
{
match
*
self
{
ConstantKind
::
Ty
(
c
)
=>
c
.visit_with
(
visitor
),
ConstantKind
::
Val
(
_
,
t
)
=>
t
.visit_with
(
visitor
),
}
}
}
compiler/rustc_middle/src/ty/mod.rs
浏览文件 @
f66c06f7
...
...
@@ -1385,7 +1385,9 @@ fn try_fold_with<F: ty::fold::FallibleTypeFolder<'tcx>>(
self
.constness
()
.try_fold_with
(
folder
)
?
,
))
}
}
impl
<
'tcx
>
TypeVisitable
<
'tcx
>
for
ParamEnv
<
'tcx
>
{
fn
visit_with
<
V
:
TypeVisitor
<
'tcx
>>
(
&
self
,
visitor
:
&
mut
V
)
->
ControlFlow
<
V
::
BreakTy
>
{
self
.caller_bounds
()
.visit_with
(
visitor
)
?
;
self
.reveal
()
.visit_with
(
visitor
)
?
;
...
...
compiler/rustc_middle/src/ty/structural_impls.rs
浏览文件 @
f66c06f7
...
...
@@ -6,6 +6,7 @@
use
crate
::
mir
::
ProjectionKind
;
use
crate
::
ty
::
fold
::{
FallibleTypeFolder
,
TypeFoldable
,
TypeSuperFoldable
,
TypeVisitor
};
use
crate
::
ty
::
print
::{
with_no_trimmed_paths
,
FmtPrinter
,
Printer
};
use
crate
::
ty
::
visit
::{
TypeSuperVisitable
,
TypeVisitable
};
use
crate
::
ty
::{
self
,
InferConst
,
Lift
,
Term
,
Ty
,
TyCtxt
};
use
rustc_data_structures
::
functor
::
IdFunctor
;
use
rustc_hir
as
hir
;
...
...
@@ -651,7 +652,9 @@ impl<'tcx> TypeFoldable<'tcx> for ty::AdtDef<'tcx> {
fn
try_fold_with
<
F
:
FallibleTypeFolder
<
'tcx
>>
(
self
,
_
folder
:
&
mut
F
)
->
Result
<
Self
,
F
::
Error
>
{
Ok
(
self
)
}
}
impl
<
'tcx
>
TypeVisitable
<
'tcx
>
for
ty
::
AdtDef
<
'tcx
>
{
fn
visit_with
<
V
:
TypeVisitor
<
'tcx
>>
(
&
self
,
_
visitor
:
&
mut
V
)
->
ControlFlow
<
V
::
BreakTy
>
{
ControlFlow
::
CONTINUE
}
...
...
@@ -664,7 +667,9 @@ fn try_fold_with<F: FallibleTypeFolder<'tcx>>(
)
->
Result
<
(
T
,
U
),
F
::
Error
>
{
Ok
((
self
.0
.try_fold_with
(
folder
)
?
,
self
.1
.try_fold_with
(
folder
)
?
))
}
}
impl
<
'tcx
,
T
:
TypeVisitable
<
'tcx
>
,
U
:
TypeVisitable
<
'tcx
>>
TypeVisitable
<
'tcx
>
for
(
T
,
U
)
{
fn
visit_with
<
V
:
TypeVisitor
<
'tcx
>>
(
&
self
,
visitor
:
&
mut
V
)
->
ControlFlow
<
V
::
BreakTy
>
{
self
.0
.visit_with
(
visitor
)
?
;
self
.1
.visit_with
(
visitor
)
...
...
@@ -684,7 +689,11 @@ fn try_fold_with<F: FallibleTypeFolder<'tcx>>(
self
.2
.try_fold_with
(
folder
)
?
,
))
}
}
impl
<
'tcx
,
A
:
TypeVisitable
<
'tcx
>
,
B
:
TypeVisitable
<
'tcx
>
,
C
:
TypeVisitable
<
'tcx
>>
TypeVisitable
<
'tcx
>
for
(
A
,
B
,
C
)
{
fn
visit_with
<
V
:
TypeVisitor
<
'tcx
>>
(
&
self
,
visitor
:
&
mut
V
)
->
ControlFlow
<
V
::
BreakTy
>
{
self
.0
.visit_with
(
visitor
)
?
;
self
.1
.visit_with
(
visitor
)
?
;
...
...
@@ -756,7 +765,9 @@ fn try_fold_with<F: FallibleTypeFolder<'tcx>>(
Ok
(
Rc
::
from_raw
(
Rc
::
into_raw
(
unique
)
.cast
()))
}
}
}
impl
<
'tcx
,
T
:
TypeVisitable
<
'tcx
>>
TypeVisitable
<
'tcx
>
for
Rc
<
T
>
{
fn
visit_with
<
V
:
TypeVisitor
<
'tcx
>>
(
&
self
,
visitor
:
&
mut
V
)
->
ControlFlow
<
V
::
BreakTy
>
{
(
**
self
)
.visit_with
(
visitor
)
}
...
...
@@ -800,7 +811,9 @@ fn try_fold_with<F: FallibleTypeFolder<'tcx>>(
Ok
(
Arc
::
from_raw
(
Arc
::
into_raw
(
unique
)
.cast
()))
}
}
}
impl
<
'tcx
,
T
:
TypeVisitable
<
'tcx
>>
TypeVisitable
<
'tcx
>
for
Arc
<
T
>
{
fn
visit_with
<
V
:
TypeVisitor
<
'tcx
>>
(
&
self
,
visitor
:
&
mut
V
)
->
ControlFlow
<
V
::
BreakTy
>
{
(
**
self
)
.visit_with
(
visitor
)
}
...
...
@@ -810,7 +823,9 @@ impl<'tcx, T: TypeFoldable<'tcx>> TypeFoldable<'tcx> for Box<T> {
fn
try_fold_with
<
F
:
FallibleTypeFolder
<
'tcx
>>
(
self
,
folder
:
&
mut
F
)
->
Result
<
Self
,
F
::
Error
>
{
self
.try_map_id
(|
value
|
value
.try_fold_with
(
folder
))
}
}
impl
<
'tcx
,
T
:
TypeVisitable
<
'tcx
>>
TypeVisitable
<
'tcx
>
for
Box
<
T
>
{
fn
visit_with
<
V
:
TypeVisitor
<
'tcx
>>
(
&
self
,
visitor
:
&
mut
V
)
->
ControlFlow
<
V
::
BreakTy
>
{
(
**
self
)
.visit_with
(
visitor
)
}
...
...
@@ -820,7 +835,9 @@ impl<'tcx, T: TypeFoldable<'tcx>> TypeFoldable<'tcx> for Vec<T> {
fn
try_fold_with
<
F
:
FallibleTypeFolder
<
'tcx
>>
(
self
,
folder
:
&
mut
F
)
->
Result
<
Self
,
F
::
Error
>
{
self
.try_map_id
(|
t
|
t
.try_fold_with
(
folder
))
}
}
impl
<
'tcx
,
T
:
TypeVisitable
<
'tcx
>>
TypeVisitable
<
'tcx
>
for
Vec
<
T
>
{
fn
visit_with
<
V
:
TypeVisitor
<
'tcx
>>
(
&
self
,
visitor
:
&
mut
V
)
->
ControlFlow
<
V
::
BreakTy
>
{
self
.iter
()
.try_for_each
(|
t
|
t
.visit_with
(
visitor
))
}
...
...
@@ -830,7 +847,9 @@ impl<'tcx, T: TypeFoldable<'tcx>> TypeFoldable<'tcx> for Box<[T]> {
fn
try_fold_with
<
F
:
FallibleTypeFolder
<
'tcx
>>
(
self
,
folder
:
&
mut
F
)
->
Result
<
Self
,
F
::
Error
>
{
self
.try_map_id
(|
t
|
t
.try_fold_with
(
folder
))
}
}
impl
<
'tcx
,
T
:
TypeVisitable
<
'tcx
>>
TypeVisitable
<
'tcx
>
for
Box
<
[
T
]
>
{
fn
visit_with
<
V
:
TypeVisitor
<
'tcx
>>
(
&
self
,
visitor
:
&
mut
V
)
->
ControlFlow
<
V
::
BreakTy
>
{
self
.iter
()
.try_for_each
(|
t
|
t
.visit_with
(
visitor
))
}
...
...
@@ -840,7 +859,9 @@ impl<'tcx, T: TypeFoldable<'tcx>> TypeFoldable<'tcx> for ty::EarlyBinder<T> {
fn
try_fold_with
<
F
:
FallibleTypeFolder
<
'tcx
>>
(
self
,
folder
:
&
mut
F
)
->
Result
<
Self
,
F
::
Error
>
{
self
.try_map_bound
(|
ty
|
ty
.try_fold_with
(
folder
))
}
}
impl
<
'tcx
,
T
:
TypeVisitable
<
'tcx
>>
TypeVisitable
<
'tcx
>
for
ty
::
EarlyBinder
<
T
>
{
fn
visit_with
<
V
:
TypeVisitor
<
'tcx
>>
(
&
self
,
visitor
:
&
mut
V
)
->
ControlFlow
<
V
::
BreakTy
>
{
self
.as_ref
()
.0
.visit_with
(
visitor
)
}
...
...
@@ -850,7 +871,9 @@ impl<'tcx, T: TypeFoldable<'tcx>> TypeFoldable<'tcx> for ty::Binder<'tcx, T> {
fn
try_fold_with
<
F
:
FallibleTypeFolder
<
'tcx
>>
(
self
,
folder
:
&
mut
F
)
->
Result
<
Self
,
F
::
Error
>
{
folder
.try_fold_binder
(
self
)
}
}
impl
<
'tcx
,
T
:
TypeVisitable
<
'tcx
>>
TypeVisitable
<
'tcx
>
for
ty
::
Binder
<
'tcx
,
T
>
{
fn
visit_with
<
V
:
TypeVisitor
<
'tcx
>>
(
&
self
,
visitor
:
&
mut
V
)
->
ControlFlow
<
V
::
BreakTy
>
{
visitor
.visit_binder
(
self
)
}
...
...
@@ -863,7 +886,9 @@ fn try_super_fold_with<F: FallibleTypeFolder<'tcx>>(
)
->
Result
<
Self
,
F
::
Error
>
{
self
.try_map_bound
(|
ty
|
ty
.try_fold_with
(
folder
))
}
}
impl
<
'tcx
,
T
:
TypeVisitable
<
'tcx
>>
TypeSuperVisitable
<
'tcx
>
for
ty
::
Binder
<
'tcx
,
T
>
{
fn
super_visit_with
<
V
:
TypeVisitor
<
'tcx
>>
(
&
self
,
visitor
:
&
mut
V
)
->
ControlFlow
<
V
::
BreakTy
>
{
self
.as_ref
()
.skip_binder
()
.visit_with
(
visitor
)
}
...
...
@@ -873,7 +898,11 @@ impl<'tcx> TypeFoldable<'tcx> for &'tcx ty::List<ty::Binder<'tcx, ty::Existentia
fn
try_fold_with
<
F
:
FallibleTypeFolder
<
'tcx
>>
(
self
,
folder
:
&
mut
F
)
->
Result
<
Self
,
F
::
Error
>
{
ty
::
util
::
fold_list
(
self
,
folder
,
|
tcx
,
v
|
tcx
.intern_poly_existential_predicates
(
v
))
}
}
impl
<
'tcx
>
TypeVisitable
<
'tcx
>
for
&
'tcx
ty
::
List
<
ty
::
Binder
<
'tcx
,
ty
::
ExistentialPredicate
<
'tcx
>>>
{
fn
visit_with
<
V
:
TypeVisitor
<
'tcx
>>
(
&
self
,
visitor
:
&
mut
V
)
->
ControlFlow
<
V
::
BreakTy
>
{
self
.iter
()
.try_for_each
(|
p
|
p
.visit_with
(
visitor
))
}
...
...
@@ -883,7 +912,9 @@ impl<'tcx> TypeFoldable<'tcx> for &'tcx ty::List<ProjectionKind> {
fn
try_fold_with
<
F
:
FallibleTypeFolder
<
'tcx
>>
(
self
,
folder
:
&
mut
F
)
->
Result
<
Self
,
F
::
Error
>
{
ty
::
util
::
fold_list
(
self
,
folder
,
|
tcx
,
v
|
tcx
.intern_projs
(
v
))
}
}
impl
<
'tcx
>
TypeVisitable
<
'tcx
>
for
&
'tcx
ty
::
List
<
ProjectionKind
>
{
fn
visit_with
<
V
:
TypeVisitor
<
'tcx
>>
(
&
self
,
visitor
:
&
mut
V
)
->
ControlFlow
<
V
::
BreakTy
>
{
self
.iter
()
.try_for_each
(|
t
|
t
.visit_with
(
visitor
))
}
...
...
@@ -915,7 +946,9 @@ fn try_fold_with<F: FallibleTypeFolder<'tcx>>(self, folder: &mut F) -> Result<Se
},
})
}
}
impl
<
'tcx
>
TypeVisitable
<
'tcx
>
for
ty
::
instance
::
Instance
<
'tcx
>
{
fn
visit_with
<
V
:
TypeVisitor
<
'tcx
>>
(
&
self
,
visitor
:
&
mut
V
)
->
ControlFlow
<
V
::
BreakTy
>
{
use
crate
::
ty
::
InstanceDef
::
*
;
self
.substs
.visit_with
(
visitor
)
?
;
...
...
@@ -941,7 +974,9 @@ impl<'tcx> TypeFoldable<'tcx> for interpret::GlobalId<'tcx> {
fn
try_fold_with
<
F
:
FallibleTypeFolder
<
'tcx
>>
(
self
,
folder
:
&
mut
F
)
->
Result
<
Self
,
F
::
Error
>
{
Ok
(
Self
{
instance
:
self
.instance
.try_fold_with
(
folder
)
?
,
promoted
:
self
.promoted
})
}
}
impl
<
'tcx
>
TypeVisitable
<
'tcx
>
for
interpret
::
GlobalId
<
'tcx
>
{
fn
visit_with
<
V
:
TypeVisitor
<
'tcx
>>
(
&
self
,
visitor
:
&
mut
V
)
->
ControlFlow
<
V
::
BreakTy
>
{
self
.instance
.visit_with
(
visitor
)
}
...
...
@@ -951,7 +986,9 @@ impl<'tcx> TypeFoldable<'tcx> for Ty<'tcx> {
fn
try_fold_with
<
F
:
FallibleTypeFolder
<
'tcx
>>
(
self
,
folder
:
&
mut
F
)
->
Result
<
Self
,
F
::
Error
>
{
folder
.try_fold_ty
(
self
)
}
}
impl
<
'tcx
>
TypeVisitable
<
'tcx
>
for
Ty
<
'tcx
>
{
fn
visit_with
<
V
:
TypeVisitor
<
'tcx
>>
(
&
self
,
visitor
:
&
mut
V
)
->
ControlFlow
<
V
::
BreakTy
>
{
visitor
.visit_ty
(
*
self
)
}
...
...
@@ -1001,7 +1038,9 @@ fn try_super_fold_with<F: FallibleTypeFolder<'tcx>>(
Ok
(
if
*
self
.kind
()
==
kind
{
self
}
else
{
folder
.tcx
()
.mk_ty
(
kind
)
})
}
}
impl
<
'tcx
>
TypeSuperVisitable
<
'tcx
>
for
Ty
<
'tcx
>
{
fn
super_visit_with
<
V
:
TypeVisitor
<
'tcx
>>
(
&
self
,
visitor
:
&
mut
V
)
->
ControlFlow
<
V
::
BreakTy
>
{
match
self
.kind
()
{
ty
::
RawPtr
(
ref
tm
)
=>
tm
.visit_with
(
visitor
),
...
...
@@ -1049,7 +1088,9 @@ impl<'tcx> TypeFoldable<'tcx> for ty::Region<'tcx> {
fn
try_fold_with
<
F
:
FallibleTypeFolder
<
'tcx
>>
(
self
,
folder
:
&
mut
F
)
->
Result
<
Self
,
F
::
Error
>
{
folder
.try_fold_region
(
self
)
}
}
impl
<
'tcx
>
TypeVisitable
<
'tcx
>
for
ty
::
Region
<
'tcx
>
{
fn
visit_with
<
V
:
TypeVisitor
<
'tcx
>>
(
&
self
,
visitor
:
&
mut
V
)
->
ControlFlow
<
V
::
BreakTy
>
{
visitor
.visit_region
(
*
self
)
}
...
...
@@ -1062,7 +1103,9 @@ fn try_super_fold_with<F: FallibleTypeFolder<'tcx>>(
)
->
Result
<
Self
,
F
::
Error
>
{
Ok
(
self
)
}
}
impl
<
'tcx
>
TypeSuperVisitable
<
'tcx
>
for
ty
::
Region
<
'tcx
>
{
fn
super_visit_with
<
V
:
TypeVisitor
<
'tcx
>>
(
&
self
,
_
visitor
:
&
mut
V
)
->
ControlFlow
<
V
::
BreakTy
>
{
ControlFlow
::
CONTINUE
}
...
...
@@ -1072,7 +1115,9 @@ impl<'tcx> TypeFoldable<'tcx> for ty::Predicate<'tcx> {
fn
try_fold_with
<
F
:
FallibleTypeFolder
<
'tcx
>>
(
self
,
folder
:
&
mut
F
)
->
Result
<
Self
,
F
::
Error
>
{
folder
.try_fold_predicate
(
self
)
}
}
impl
<
'tcx
>
TypeVisitable
<
'tcx
>
for
ty
::
Predicate
<
'tcx
>
{
fn
visit_with
<
V
:
TypeVisitor
<
'tcx
>>
(
&
self
,
visitor
:
&
mut
V
)
->
ControlFlow
<
V
::
BreakTy
>
{
visitor
.visit_predicate
(
*
self
)
}
...
...
@@ -1094,7 +1139,9 @@ fn try_super_fold_with<F: FallibleTypeFolder<'tcx>>(
let
new
=
self
.kind
()
.try_fold_with
(
folder
)
?
;
Ok
(
folder
.tcx
()
.reuse_or_mk_predicate
(
self
,
new
))
}
}
impl
<
'tcx
>
TypeSuperVisitable
<
'tcx
>
for
ty
::
Predicate
<
'tcx
>
{
fn
super_visit_with
<
V
:
TypeVisitor
<
'tcx
>>
(
&
self
,
visitor
:
&
mut
V
)
->
ControlFlow
<
V
::
BreakTy
>
{
self
.kind
()
.visit_with
(
visitor
)
}
...
...
@@ -1104,7 +1151,9 @@ impl<'tcx> TypeFoldable<'tcx> for &'tcx ty::List<ty::Predicate<'tcx>> {
fn
try_fold_with
<
F
:
FallibleTypeFolder
<
'tcx
>>
(
self
,
folder
:
&
mut
F
)
->
Result
<
Self
,
F
::
Error
>
{
ty
::
util
::
fold_list
(
self
,
folder
,
|
tcx
,
v
|
tcx
.intern_predicates
(
v
))
}
}
impl
<
'tcx
>
TypeVisitable
<
'tcx
>
for
&
'tcx
ty
::
List
<
ty
::
Predicate
<
'tcx
>>
{
fn
visit_with
<
V
:
TypeVisitor
<
'tcx
>>
(
&
self
,
visitor
:
&
mut
V
)
->
ControlFlow
<
V
::
BreakTy
>
{
self
.iter
()
.try_for_each
(|
p
|
p
.visit_with
(
visitor
))
}
...
...
@@ -1114,7 +1163,9 @@ impl<'tcx, T: TypeFoldable<'tcx>, I: Idx> TypeFoldable<'tcx> for IndexVec<I, T>
fn
try_fold_with
<
F
:
FallibleTypeFolder
<
'tcx
>>
(
self
,
folder
:
&
mut
F
)
->
Result
<
Self
,
F
::
Error
>
{
self
.try_map_id
(|
x
|
x
.try_fold_with
(
folder
))
}
}
impl
<
'tcx
,
T
:
TypeVisitable
<
'tcx
>
,
I
:
Idx
>
TypeVisitable
<
'tcx
>
for
IndexVec
<
I
,
T
>
{
fn
visit_with
<
V
:
TypeVisitor
<
'tcx
>>
(
&
self
,
visitor
:
&
mut
V
)
->
ControlFlow
<
V
::
BreakTy
>
{
self
.iter
()
.try_for_each
(|
t
|
t
.visit_with
(
visitor
))
}
...
...
@@ -1124,7 +1175,9 @@ impl<'tcx> TypeFoldable<'tcx> for ty::Const<'tcx> {
fn
try_fold_with
<
F
:
FallibleTypeFolder
<
'tcx
>>
(
self
,
folder
:
&
mut
F
)
->
Result
<
Self
,
F
::
Error
>
{
folder
.try_fold_const
(
self
)
}
}
impl
<
'tcx
>
TypeVisitable
<
'tcx
>
for
ty
::
Const
<
'tcx
>
{
fn
visit_with
<
V
:
TypeVisitor
<
'tcx
>>
(
&
self
,
visitor
:
&
mut
V
)
->
ControlFlow
<
V
::
BreakTy
>
{
visitor
.visit_const
(
*
self
)
}
...
...
@@ -1143,7 +1196,9 @@ fn try_super_fold_with<F: FallibleTypeFolder<'tcx>>(
Ok
(
self
)
}
}
}
impl
<
'tcx
>
TypeSuperVisitable
<
'tcx
>
for
ty
::
Const
<
'tcx
>
{
fn
super_visit_with
<
V
:
TypeVisitor
<
'tcx
>>
(
&
self
,
visitor
:
&
mut
V
)
->
ControlFlow
<
V
::
BreakTy
>
{
self
.ty
()
.visit_with
(
visitor
)
?
;
self
.kind
()
.visit_with
(
visitor
)
...
...
@@ -1162,7 +1217,9 @@ fn try_fold_with<F: FallibleTypeFolder<'tcx>>(self, folder: &mut F) -> Result<Se
|
ty
::
ConstKind
::
Error
(
_
)
=>
self
,
})
}
}
impl
<
'tcx
>
TypeVisitable
<
'tcx
>
for
ty
::
ConstKind
<
'tcx
>
{
fn
visit_with
<
V
:
TypeVisitor
<
'tcx
>>
(
&
self
,
visitor
:
&
mut
V
)
->
ControlFlow
<
V
::
BreakTy
>
{
match
*
self
{
ty
::
ConstKind
::
Infer
(
ic
)
=>
ic
.visit_with
(
visitor
),
...
...
@@ -1180,7 +1237,9 @@ impl<'tcx> TypeFoldable<'tcx> for InferConst<'tcx> {
fn
try_fold_with
<
F
:
FallibleTypeFolder
<
'tcx
>>
(
self
,
_
folder
:
&
mut
F
)
->
Result
<
Self
,
F
::
Error
>
{
Ok
(
self
)
}
}
impl
<
'tcx
>
TypeVisitable
<
'tcx
>
for
InferConst
<
'tcx
>
{
fn
visit_with
<
V
:
TypeVisitor
<
'tcx
>>
(
&
self
,
_
visitor
:
&
mut
V
)
->
ControlFlow
<
V
::
BreakTy
>
{
ControlFlow
::
CONTINUE
}
...
...
@@ -1190,7 +1249,9 @@ impl<'tcx> TypeFoldable<'tcx> for ty::Unevaluated<'tcx> {
fn
try_fold_with
<
F
:
FallibleTypeFolder
<
'tcx
>>
(
self
,
folder
:
&
mut
F
)
->
Result
<
Self
,
F
::
Error
>
{
folder
.try_fold_unevaluated
(
self
)
}
}
impl
<
'tcx
>
TypeVisitable
<
'tcx
>
for
ty
::
Unevaluated
<
'tcx
>
{
fn
visit_with
<
V
:
TypeVisitor
<
'tcx
>>
(
&
self
,
visitor
:
&
mut
V
)
->
ControlFlow
<
V
::
BreakTy
>
{
visitor
.visit_unevaluated
(
*
self
)
}
...
...
@@ -1207,7 +1268,9 @@ fn try_super_fold_with<F: FallibleTypeFolder<'tcx>>(
promoted
:
self
.promoted
,
})
}
}
impl
<
'tcx
>
TypeSuperVisitable
<
'tcx
>
for
ty
::
Unevaluated
<
'tcx
>
{
fn
super_visit_with
<
V
:
TypeVisitor
<
'tcx
>>
(
&
self
,
visitor
:
&
mut
V
)
->
ControlFlow
<
V
::
BreakTy
>
{
self
.substs
.visit_with
(
visitor
)
}
...
...
@@ -1217,7 +1280,9 @@ impl<'tcx> TypeFoldable<'tcx> for ty::Unevaluated<'tcx, ()> {
fn
try_fold_with
<
F
:
FallibleTypeFolder
<
'tcx
>>
(
self
,
folder
:
&
mut
F
)
->
Result
<
Self
,
F
::
Error
>
{
Ok
(
self
.expand
()
.try_fold_with
(
folder
)
?
.shrink
())
}
}
impl
<
'tcx
>
TypeVisitable
<
'tcx
>
for
ty
::
Unevaluated
<
'tcx
,
()
>
{
fn
visit_with
<
V
:
TypeVisitor
<
'tcx
>>
(
&
self
,
visitor
:
&
mut
V
)
->
ControlFlow
<
V
::
BreakTy
>
{
self
.expand
()
.visit_with
(
visitor
)
}
...
...
@@ -1227,7 +1292,9 @@ impl<'tcx> TypeFoldable<'tcx> for hir::Constness {
fn
try_fold_with
<
F
:
FallibleTypeFolder
<
'tcx
>>
(
self
,
_
:
&
mut
F
)
->
Result
<
Self
,
F
::
Error
>
{
Ok
(
self
)
}
}
impl
<
'tcx
>
TypeVisitable
<
'tcx
>
for
hir
::
Constness
{
fn
visit_with
<
V
:
TypeVisitor
<
'tcx
>>
(
&
self
,
_
:
&
mut
V
)
->
ControlFlow
<
V
::
BreakTy
>
{
ControlFlow
::
CONTINUE
}
...
...
compiler/rustc_middle/src/ty/subst.rs
浏览文件 @
f66c06f7
...
...
@@ -6,6 +6,7 @@
FallibleTypeFolder
,
TypeFoldable
,
TypeFolder
,
TypeSuperFoldable
,
TypeVisitor
,
};
use
crate
::
ty
::
sty
::{
ClosureSubsts
,
GeneratorSubsts
,
InlineConstSubsts
};
use
crate
::
ty
::
visit
::
TypeVisitable
;
use
crate
::
ty
::{
self
,
Lift
,
List
,
ParamConst
,
Ty
,
TyCtxt
};
use
rustc_data_structures
::
intern
::{
Interned
,
WithStableHash
};
...
...
@@ -205,7 +206,9 @@ fn try_fold_with<F: FallibleTypeFolder<'tcx>>(self, folder: &mut F) -> Result<Se
GenericArgKind
::
Const
(
ct
)
=>
ct
.try_fold_with
(
folder
)
.map
(
Into
::
into
),
}
}
}
impl
<
'tcx
>
TypeVisitable
<
'tcx
>
for
GenericArg
<
'tcx
>
{
fn
visit_with
<
V
:
TypeVisitor
<
'tcx
>>
(
&
self
,
visitor
:
&
mut
V
)
->
ControlFlow
<
V
::
BreakTy
>
{
match
self
.unpack
()
{
GenericArgKind
::
Lifetime
(
lt
)
=>
lt
.visit_with
(
visitor
),
...
...
@@ -449,7 +452,9 @@ fn try_fold_with<F: FallibleTypeFolder<'tcx>>(self, folder: &mut F) -> Result<Se
_
=>
ty
::
util
::
fold_list
(
self
,
folder
,
|
tcx
,
v
|
tcx
.intern_substs
(
v
)),
}
}
}
impl
<
'tcx
>
TypeVisitable
<
'tcx
>
for
SubstsRef
<
'tcx
>
{
fn
visit_with
<
V
:
TypeVisitor
<
'tcx
>>
(
&
self
,
visitor
:
&
mut
V
)
->
ControlFlow
<
V
::
BreakTy
>
{
self
.iter
()
.try_for_each
(|
t
|
t
.visit_with
(
visitor
))
}
...
...
@@ -485,7 +490,9 @@ fn try_fold_with<F: FallibleTypeFolder<'tcx>>(self, folder: &mut F) -> Result<Se
_
=>
ty
::
util
::
fold_list
(
self
,
folder
,
|
tcx
,
v
|
tcx
.intern_type_list
(
v
)),
}
}
}
impl
<
'tcx
>
TypeVisitable
<
'tcx
>
for
&
'tcx
ty
::
List
<
Ty
<
'tcx
>>
{
fn
visit_with
<
V
:
TypeVisitor
<
'tcx
>>
(
&
self
,
visitor
:
&
mut
V
)
->
ControlFlow
<
V
::
BreakTy
>
{
self
.iter
()
.try_for_each
(|
t
|
t
.visit_with
(
visitor
))
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录