1 use {Generics, Lifetime, MutTy, Mutability, Path, QSelf, Ty, TyParamBound}
;
2 use aster
::ident
::ToIdent
;
3 use aster
::invoke
::{Invoke, Identity}
;
4 use aster
::lifetime
::IntoLifetime
;
5 use aster
::path
::PathBuilder
;
6 use aster
::qpath
::QPathBuilder
;
7 use aster
::ty_param
::TyParamBoundBuilder
;
9 // ////////////////////////////////////////////////////////////////////////////
11 pub struct TyBuilder
<F
= Identity
> {
16 pub fn new() -> Self {
17 TyBuilder
::with_callback(Identity
)
24 pub fn with_callback(callback
: F
) -> Self {
25 TyBuilder { callback: callback }
28 pub fn build(self, ty
: Ty
) -> F
::Result
{
29 self.callback
.invoke(ty
)
32 pub fn id
<I
>(self, id
: I
) -> F
::Result
35 self.path().id(id
).build()
38 pub fn build_path(self, path
: Path
) -> F
::Result
{
39 self.build(Ty
::Path(None
, path
))
42 pub fn build_qpath(self, qself
: QSelf
, path
: Path
) -> F
::Result
{
43 self.build(Ty
::Path(Some(qself
), path
))
46 pub fn path(self) -> PathBuilder
<TyPathBuilder
<F
>> {
47 PathBuilder
::with_callback(TyPathBuilder(self))
50 pub fn qpath(self) -> QPathBuilder
<TyQPathBuilder
<F
>> {
51 QPathBuilder
::with_callback(TyQPathBuilder(self))
54 pub fn isize(self) -> F
::Result
{
58 pub fn i8(self) -> F
::Result
{
62 pub fn i16(self) -> F
::Result
{
66 pub fn i32(self) -> F
::Result
{
70 pub fn i64(self) -> F
::Result
{
74 pub fn usize(self) -> F
::Result
{
78 pub fn u8(self) -> F
::Result
{
82 pub fn u16(self) -> F
::Result
{
86 pub fn u32(self) -> F
::Result
{
90 pub fn u64(self) -> F
::Result
{
94 pub fn f32(self) -> F
::Result
{
98 pub fn f64(self) -> F
::Result
{
102 pub fn bool(self) -> F
::Result
{
106 pub fn unit(self) -> F
::Result
{
110 pub fn tuple(self) -> TyTupleBuilder
<F
> {
117 pub fn build_slice(self, ty
: Ty
) -> F
::Result
{
118 self.build(Ty
::Slice(Box
::new(ty
)))
121 pub fn slice(self) -> TyBuilder
<TySliceBuilder
<F
>> {
122 TyBuilder
::with_callback(TySliceBuilder(self))
125 pub fn ref_(self) -> TyRefBuilder
<F
> {
129 mutability
: Mutability
::Immutable
,
133 pub fn never(self) -> F
::Result
{
134 self.build(Ty
::Never
)
137 pub fn infer(self) -> F
::Result
{
138 self.build(Ty
::Infer
)
141 pub fn option(self) -> TyBuilder
<TyOptionBuilder
<F
>> {
142 TyBuilder
::with_callback(TyOptionBuilder(self))
145 pub fn result(self) -> TyBuilder
<TyResultOkBuilder
<F
>> {
146 TyBuilder
::with_callback(TyResultOkBuilder(self))
149 pub fn phantom_data(self) -> TyBuilder
<TyPhantomDataBuilder
<F
>> {
150 TyBuilder
::with_callback(TyPhantomDataBuilder(self))
153 pub fn box_(self) -> TyBuilder
<TyBoxBuilder
<F
>> {
154 TyBuilder
::with_callback(TyBoxBuilder(self))
157 pub fn iterator(self) -> TyBuilder
<TyIteratorBuilder
<F
>> {
158 TyBuilder
::with_callback(TyIteratorBuilder(self))
161 pub fn impl_trait(self) -> TyImplTraitTyBuilder
<F
> {
162 TyImplTraitTyBuilder
{
169 // ////////////////////////////////////////////////////////////////////////////
171 pub struct TyPathBuilder
<F
>(TyBuilder
<F
>);
173 impl<F
> Invoke
<Path
> for TyPathBuilder
<F
>
176 type Result
= F
::Result
;
178 fn invoke(self, path
: Path
) -> F
::Result
{
179 self.0.build_path(path
)
183 // ////////////////////////////////////////////////////////////////////////////
185 pub struct TyQPathBuilder
<F
>(TyBuilder
<F
>);
187 impl<F
> Invoke
<(QSelf
, Path
)> for TyQPathBuilder
<F
>
190 type Result
= F
::Result
;
192 fn invoke(self, (qself
, path
): (QSelf
, Path
)) -> F
::Result
{
193 self.0.build_qpath(qself
, path
)
197 // ////////////////////////////////////////////////////////////////////////////
199 pub struct TySliceBuilder
<F
>(TyBuilder
<F
>);
201 impl<F
> Invoke
<Ty
> for TySliceBuilder
<F
>
204 type Result
= F
::Result
;
206 fn invoke(self, ty
: Ty
) -> F
::Result
{
207 self.0.build_slice(ty
)
211 // ////////////////////////////////////////////////////////////////////////////
213 pub struct TyRefBuilder
<F
> {
214 builder
: TyBuilder
<F
>,
215 lifetime
: Option
<Lifetime
>,
216 mutability
: Mutability
,
219 impl<F
> TyRefBuilder
<F
>
222 pub fn mut_(mut self) -> Self {
223 self.mutability
= Mutability
::Mutable
;
227 pub fn lifetime
<N
>(mut self, name
: N
) -> Self
230 self.lifetime
= Some(Lifetime { ident: name.to_ident() }
);
234 pub fn build_ty(self, ty
: Ty
) -> F
::Result
{
237 mutability
: self.mutability
,
239 self.builder
.build(Ty
::Rptr(self.lifetime
, Box
::new(ty
)))
242 pub fn ty(self) -> TyBuilder
<Self> {
243 TyBuilder
::with_callback(self)
247 impl<F
> Invoke
<Ty
> for TyRefBuilder
<F
>
250 type Result
= F
::Result
;
252 fn invoke(self, ty
: Ty
) -> F
::Result
{
257 // ////////////////////////////////////////////////////////////////////////////
259 pub struct TyOptionBuilder
<F
>(TyBuilder
<F
>);
261 impl<F
> Invoke
<Ty
> for TyOptionBuilder
<F
>
264 type Result
= F
::Result
;
266 fn invoke(self, ty
: Ty
) -> F
::Result
{
267 let path
= PathBuilder
::new()
276 self.0.build_path(path
)
280 // ////////////////////////////////////////////////////////////////////////////
282 pub struct TyResultOkBuilder
<F
>(TyBuilder
<F
>);
284 impl<F
> Invoke
<Ty
> for TyResultOkBuilder
<F
>
287 type Result
= TyBuilder
<TyResultErrBuilder
<F
>>;
289 fn invoke(self, ty
: Ty
) -> TyBuilder
<TyResultErrBuilder
<F
>> {
290 TyBuilder
::with_callback(TyResultErrBuilder(self.0, ty
))
294 pub struct TyResultErrBuilder
<F
>(TyBuilder
<F
>, Ty
);
296 impl<F
> Invoke
<Ty
> for TyResultErrBuilder
<F
>
299 type Result
= F
::Result
;
301 fn invoke(self, ty
: Ty
) -> F
::Result
{
302 let path
= PathBuilder
::new()
312 self.0.build_path(path
)
316 // ////////////////////////////////////////////////////////////////////////////
318 pub struct TyPhantomDataBuilder
<F
>(TyBuilder
<F
>);
320 impl<F
> Invoke
<Ty
> for TyPhantomDataBuilder
<F
>
323 type Result
= F
::Result
;
325 fn invoke(self, ty
: Ty
) -> F
::Result
{
326 let path
= PathBuilder
::new()
330 .segment("PhantomData")
335 self.0.build_path(path
)
339 // ////////////////////////////////////////////////////////////////////////////
341 pub struct TyBoxBuilder
<F
>(TyBuilder
<F
>);
343 impl<F
> Invoke
<Ty
> for TyBoxBuilder
<F
>
346 type Result
= F
::Result
;
348 fn invoke(self, ty
: Ty
) -> F
::Result
{
349 let path
= PathBuilder
::new()
358 self.0.build_path(path
)
362 // ////////////////////////////////////////////////////////////////////////////
364 pub struct TyIteratorBuilder
<F
>(TyBuilder
<F
>);
366 impl<F
> Invoke
<Ty
> for TyIteratorBuilder
<F
>
369 type Result
= F
::Result
;
371 fn invoke(self, ty
: Ty
) -> F
::Result
{
372 let path
= PathBuilder
::new()
382 self.0.build_path(path
)
386 // ////////////////////////////////////////////////////////////////////////////
388 pub struct TyImplTraitTyBuilder
<F
> {
389 builder
: TyBuilder
<F
>,
390 bounds
: Vec
<TyParamBound
>,
393 impl<F
> TyImplTraitTyBuilder
<F
>
396 pub fn with_bounds
<I
>(mut self, iter
: I
) -> Self
397 where I
: Iterator
<Item
= TyParamBound
>
399 self.bounds
.extend(iter
);
403 pub fn with_bound(mut self, bound
: TyParamBound
) -> Self {
404 self.bounds
.push(bound
);
408 pub fn bound(self) -> TyParamBoundBuilder
<Self> {
409 TyParamBoundBuilder
::with_callback(self)
412 pub fn with_generics(self, generics
: Generics
) -> Self {
413 self.with_lifetimes(generics
.lifetimes
.into_iter().map(|def
| def
.lifetime
))
416 pub fn with_lifetimes
<I
, L
>(mut self, lifetimes
: I
) -> Self
417 where I
: Iterator
<Item
= L
>,
420 for lifetime
in lifetimes
{
421 self = self.lifetime(lifetime
);
427 pub fn lifetime
<L
>(self, lifetime
: L
) -> Self
428 where L
: IntoLifetime
430 self.bound().lifetime(lifetime
)
433 pub fn build(self) -> F
::Result
{
434 let bounds
= self.bounds
;
435 self.builder
.build(Ty
::ImplTrait(bounds
))
439 impl<F
> Invoke
<TyParamBound
> for TyImplTraitTyBuilder
<F
>
444 fn invoke(self, bound
: TyParamBound
) -> Self {
445 self.with_bound(bound
)
449 // ////////////////////////////////////////////////////////////////////////////
451 pub struct TyTupleBuilder
<F
> {
452 builder
: TyBuilder
<F
>,
456 impl<F
> TyTupleBuilder
<F
>
459 pub fn with_tys
<I
>(mut self, iter
: I
) -> Self
460 where I
: IntoIterator
<Item
= Ty
>
462 self.tys
.extend(iter
);
466 pub fn with_ty(mut self, ty
: Ty
) -> Self {
471 pub fn ty(self) -> TyBuilder
<Self> {
472 TyBuilder
::with_callback(self)
475 pub fn build(self) -> F
::Result
{
476 self.builder
.build(Ty
::Tup(self.tys
))
480 impl<F
> Invoke
<Ty
> for TyTupleBuilder
<F
>
485 fn invoke(self, ty
: Ty
) -> Self {