2024-06-22 13:35:56 +00:00
|
|
|
// Copyright (c) 2024 Jonas Schäfer <jonas@zombofant.net>
|
|
|
|
//
|
|
|
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
|
|
|
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
|
|
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
|
|
|
|
|
|
//! Module with specific [`syn::Type`] constructors.
|
|
|
|
|
|
|
|
use proc_macro2::Span;
|
2024-06-25 15:37:03 +00:00
|
|
|
use syn::{spanned::Spanned, *};
|
2024-06-22 13:35:56 +00:00
|
|
|
|
|
|
|
/// Construct a [`syn::Type`] referring to `::xso::exports::rxml::QName`.
|
|
|
|
pub(crate) fn qname_ty(span: Span) -> Type {
|
|
|
|
Type::Path(TypePath {
|
|
|
|
qself: None,
|
|
|
|
path: Path {
|
|
|
|
leading_colon: Some(syn::token::PathSep {
|
|
|
|
spans: [span, span],
|
|
|
|
}),
|
|
|
|
segments: [
|
|
|
|
PathSegment {
|
|
|
|
ident: Ident::new("xso", span),
|
|
|
|
arguments: PathArguments::None,
|
|
|
|
},
|
|
|
|
PathSegment {
|
|
|
|
ident: Ident::new("exports", span),
|
|
|
|
arguments: PathArguments::None,
|
|
|
|
},
|
|
|
|
PathSegment {
|
|
|
|
ident: Ident::new("rxml", span),
|
|
|
|
arguments: PathArguments::None,
|
|
|
|
},
|
|
|
|
PathSegment {
|
|
|
|
ident: Ident::new("QName", span),
|
|
|
|
arguments: PathArguments::None,
|
|
|
|
},
|
|
|
|
]
|
|
|
|
.into_iter()
|
|
|
|
.collect(),
|
|
|
|
},
|
|
|
|
})
|
|
|
|
}
|
2024-06-25 15:37:03 +00:00
|
|
|
|
|
|
|
/// Construct a [`syn::Expr`] referring to
|
|
|
|
/// `<#ty as ::xso::FromXmlText>::from_xml_text`.
|
|
|
|
pub(crate) fn from_xml_text_fn(ty: Type) -> Expr {
|
|
|
|
let span = ty.span();
|
|
|
|
Expr::Path(ExprPath {
|
|
|
|
attrs: Vec::new(),
|
|
|
|
qself: Some(QSelf {
|
|
|
|
lt_token: syn::token::Lt { spans: [span] },
|
|
|
|
ty: Box::new(ty),
|
|
|
|
position: 2,
|
|
|
|
as_token: Some(syn::token::As { span }),
|
|
|
|
gt_token: syn::token::Gt { spans: [span] },
|
|
|
|
}),
|
|
|
|
path: Path {
|
|
|
|
leading_colon: Some(syn::token::PathSep {
|
|
|
|
spans: [span, span],
|
|
|
|
}),
|
|
|
|
segments: [
|
|
|
|
PathSegment {
|
|
|
|
ident: Ident::new("xso", span),
|
|
|
|
arguments: PathArguments::None,
|
|
|
|
},
|
|
|
|
PathSegment {
|
|
|
|
ident: Ident::new("FromXmlText", span),
|
|
|
|
arguments: PathArguments::None,
|
|
|
|
},
|
|
|
|
PathSegment {
|
|
|
|
ident: Ident::new("from_xml_text", span),
|
|
|
|
arguments: PathArguments::None,
|
|
|
|
},
|
|
|
|
]
|
|
|
|
.into_iter()
|
|
|
|
.collect(),
|
|
|
|
},
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Construct a [`syn::Expr`] referring to
|
|
|
|
/// `<#ty as ::xso::IntoOptionalXmlText>::into_optional_xml_text`.
|
|
|
|
pub(crate) fn into_optional_xml_text_fn(ty: Type) -> Expr {
|
|
|
|
let span = ty.span();
|
|
|
|
Expr::Path(ExprPath {
|
|
|
|
attrs: Vec::new(),
|
|
|
|
qself: Some(QSelf {
|
|
|
|
lt_token: syn::token::Lt { spans: [span] },
|
|
|
|
ty: Box::new(ty),
|
|
|
|
position: 2,
|
|
|
|
as_token: Some(syn::token::As { span }),
|
|
|
|
gt_token: syn::token::Gt { spans: [span] },
|
|
|
|
}),
|
|
|
|
path: Path {
|
|
|
|
leading_colon: Some(syn::token::PathSep {
|
|
|
|
spans: [span, span],
|
|
|
|
}),
|
|
|
|
segments: [
|
|
|
|
PathSegment {
|
|
|
|
ident: Ident::new("xso", span),
|
|
|
|
arguments: PathArguments::None,
|
|
|
|
},
|
|
|
|
PathSegment {
|
|
|
|
ident: Ident::new("IntoOptionalXmlText", span),
|
|
|
|
arguments: PathArguments::None,
|
|
|
|
},
|
|
|
|
PathSegment {
|
|
|
|
ident: Ident::new("into_optional_xml_text", span),
|
|
|
|
arguments: PathArguments::None,
|
|
|
|
},
|
|
|
|
]
|
|
|
|
.into_iter()
|
|
|
|
.collect(),
|
|
|
|
},
|
|
|
|
})
|
|
|
|
}
|
2024-06-26 13:56:43 +00:00
|
|
|
|
|
|
|
/// Construct a [`syn::Expr`] referring to
|
|
|
|
/// `<#of_ty as ::std::default::Default>::default`.
|
|
|
|
pub(crate) fn default_fn(of_ty: Type) -> Expr {
|
|
|
|
let span = of_ty.span();
|
|
|
|
Expr::Path(ExprPath {
|
|
|
|
attrs: Vec::new(),
|
|
|
|
qself: Some(QSelf {
|
|
|
|
lt_token: syn::token::Lt { spans: [span] },
|
|
|
|
ty: Box::new(of_ty),
|
|
|
|
position: 3,
|
|
|
|
as_token: Some(syn::token::As { span }),
|
|
|
|
gt_token: syn::token::Gt { spans: [span] },
|
|
|
|
}),
|
|
|
|
path: Path {
|
|
|
|
leading_colon: Some(syn::token::PathSep {
|
|
|
|
spans: [span, span],
|
|
|
|
}),
|
|
|
|
segments: [
|
|
|
|
PathSegment {
|
|
|
|
ident: Ident::new("std", span),
|
|
|
|
arguments: PathArguments::None,
|
|
|
|
},
|
|
|
|
PathSegment {
|
|
|
|
ident: Ident::new("default", span),
|
|
|
|
arguments: PathArguments::None,
|
|
|
|
},
|
|
|
|
PathSegment {
|
|
|
|
ident: Ident::new("Default", span),
|
|
|
|
arguments: PathArguments::None,
|
|
|
|
},
|
|
|
|
PathSegment {
|
|
|
|
ident: Ident::new("default", span),
|
|
|
|
arguments: PathArguments::None,
|
|
|
|
},
|
|
|
|
]
|
|
|
|
.into_iter()
|
|
|
|
.collect(),
|
|
|
|
},
|
|
|
|
})
|
|
|
|
}
|