mirror of
https://github.com/pezkuwichain/serde.git
synced 2026-07-25 05:55:48 +00:00
Merge branch 'v0.6.x'
# Conflicts: # serde/src/de/mod.rs # serde_codegen/src/attr.rs # serde_codegen/src/de.rs # serde_codegen/src/lib.rs
This commit is contained in:
+2
-2
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "serde"
|
name = "serde"
|
||||||
version = "0.6.11"
|
version = "0.6.12"
|
||||||
authors = ["Erick Tryzelaar <erick.tryzelaar@gmail.com>"]
|
authors = ["Erick Tryzelaar <erick.tryzelaar@gmail.com>"]
|
||||||
license = "MIT/Apache-2.0"
|
license = "MIT/Apache-2.0"
|
||||||
description = "A generic serialization/deserialization framework"
|
description = "A generic serialization/deserialization framework"
|
||||||
@@ -17,5 +17,5 @@ num-impls = ["num-bigint", "num-complex", "num-rational"]
|
|||||||
num-rational = ["num/rational"]
|
num-rational = ["num/rational"]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
clippy = { version = "^0.0.37", optional = true }
|
clippy = { version = "^0.0.39", optional = true }
|
||||||
num = { version = "^0.1.27", default-features = false }
|
num = { version = "^0.1.27", default-features = false }
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "serde_codegen"
|
name = "serde_codegen"
|
||||||
version = "0.6.11"
|
version = "0.6.12"
|
||||||
authors = ["Erick Tryzelaar <erick.tryzelaar@gmail.com>"]
|
authors = ["Erick Tryzelaar <erick.tryzelaar@gmail.com>"]
|
||||||
license = "MIT/Apache-2.0"
|
license = "MIT/Apache-2.0"
|
||||||
description = "Macros to auto-generate implementations for the serde framework"
|
description = "Macros to auto-generate implementations for the serde framework"
|
||||||
@@ -16,13 +16,13 @@ nightly-testing = ["clippy"]
|
|||||||
with-syntex = ["quasi/with-syntex", "quasi_codegen", "quasi_codegen/with-syntex", "syntex", "syntex_syntax"]
|
with-syntex = ["quasi/with-syntex", "quasi_codegen", "quasi_codegen/with-syntex", "syntex", "syntex_syntax"]
|
||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
quasi_codegen = { version = "^0.4.0", optional = true }
|
quasi_codegen = { version = "^0.5.0", optional = true }
|
||||||
syntex = { version = "^0.26.0", optional = true }
|
syntex = { version = "^0.27.0", optional = true }
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
aster = { version = "^0.10.0", default-features = false }
|
aster = { version = "^0.11.0", default-features = false }
|
||||||
clippy = { version = "^0.0.37", optional = true }
|
clippy = { version = "^0.0.39", optional = true }
|
||||||
quasi = { version = "^0.4.0", default-features = false }
|
quasi = { version = "^0.5.0", default-features = false }
|
||||||
quasi_macros = { version = "^0.4.0", optional = true }
|
quasi_macros = { version = "^0.5.0", optional = true }
|
||||||
syntex = { version = "^0.26.0", optional = true }
|
syntex = { version = "^0.27.0", optional = true }
|
||||||
syntex_syntax = { version = "^0.26.0", optional = true }
|
syntex_syntax = { version = "^0.27.0", optional = true }
|
||||||
|
|||||||
+14
-14
@@ -31,20 +31,20 @@ impl ContainerAttrs {
|
|||||||
for meta_item in meta_items {
|
for meta_item in meta_items {
|
||||||
match meta_item.node {
|
match meta_item.node {
|
||||||
// Parse `#[serde(rename="foo")]`
|
// Parse `#[serde(rename="foo")]`
|
||||||
ast::MetaNameValue(ref name, ref lit) if name == &"rename" => {
|
ast::MetaItemKind::NameValue(ref name, ref lit) if name == &"rename" => {
|
||||||
container_attrs.serialize_name = Some(lit.clone());
|
container_attrs.serialize_name = Some(lit.clone());
|
||||||
container_attrs.deserialize_name = Some(lit.clone());
|
container_attrs.deserialize_name = Some(lit.clone());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Parse `#[serde(rename(serialize="foo", deserialize="bar"))]`
|
// Parse `#[serde(rename(serialize="foo", deserialize="bar"))]`
|
||||||
ast::MetaList(ref name, ref meta_items) if name == &"rename" => {
|
ast::MetaItemKind::List(ref name, ref meta_items) if name == &"rename" => {
|
||||||
let (ser_name, de_name) = try!(get_renames(cx, meta_items));
|
let (ser_name, de_name) = try!(get_renames(cx, meta_items));
|
||||||
container_attrs.serialize_name = ser_name;
|
container_attrs.serialize_name = ser_name;
|
||||||
container_attrs.deserialize_name = de_name;
|
container_attrs.deserialize_name = de_name;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Parse `#[serde(deny_unknown_fields)]`
|
// Parse `#[serde(deny_unknown_fields)]`
|
||||||
ast::MetaWord(ref name) if name == &"deny_unknown_fields" => {
|
ast::MetaItemKind::Word(ref name) if name == &"deny_unknown_fields" => {
|
||||||
container_attrs.deny_unknown_fields = true;
|
container_attrs.deny_unknown_fields = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -109,13 +109,13 @@ impl VariantAttrs {
|
|||||||
for meta_item in meta_items {
|
for meta_item in meta_items {
|
||||||
match meta_item.node {
|
match meta_item.node {
|
||||||
// Parse `#[serde(rename="foo")]`
|
// Parse `#[serde(rename="foo")]`
|
||||||
ast::MetaNameValue(ref name, ref lit) if name == &"rename" => {
|
ast::MetaItemKind::NameValue(ref name, ref lit) if name == &"rename" => {
|
||||||
variant_attrs.serialize_name = Some(lit.clone());
|
variant_attrs.serialize_name = Some(lit.clone());
|
||||||
variant_attrs.deserialize_name = Some(lit.clone());
|
variant_attrs.deserialize_name = Some(lit.clone());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Parse `#[serde(rename(serialize="foo", deserialize="bar"))]`
|
// Parse `#[serde(rename(serialize="foo", deserialize="bar"))]`
|
||||||
ast::MetaList(ref name, ref meta_items) if name == &"rename" => {
|
ast::MetaItemKind::List(ref name, ref meta_items) if name == &"rename" => {
|
||||||
let (ser_name, de_name) = try!(get_renames(cx, meta_items));
|
let (ser_name, de_name) = try!(get_renames(cx, meta_items));
|
||||||
variant_attrs.serialize_name = ser_name;
|
variant_attrs.serialize_name = ser_name;
|
||||||
variant_attrs.deserialize_name = de_name;
|
variant_attrs.deserialize_name = de_name;
|
||||||
@@ -192,35 +192,35 @@ impl FieldAttrs {
|
|||||||
for meta_item in meta_items {
|
for meta_item in meta_items {
|
||||||
match meta_item.node {
|
match meta_item.node {
|
||||||
// Parse `#[serde(rename="foo")]`
|
// Parse `#[serde(rename="foo")]`
|
||||||
ast::MetaNameValue(ref name, ref lit) if name == &"rename" => {
|
ast::MetaItemKind::NameValue(ref name, ref lit) if name == &"rename" => {
|
||||||
field_attrs.serialize_name = Some(lit.clone());
|
field_attrs.serialize_name = Some(lit.clone());
|
||||||
field_attrs.deserialize_name = Some(lit.clone());
|
field_attrs.deserialize_name = Some(lit.clone());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Parse `#[serde(rename(serialize="foo", deserialize="bar"))]`
|
// Parse `#[serde(rename(serialize="foo", deserialize="bar"))]`
|
||||||
ast::MetaList(ref name, ref meta_items) if name == &"rename" => {
|
ast::MetaItemKind::List(ref name, ref meta_items) if name == &"rename" => {
|
||||||
let (ser_name, de_name) = try!(get_renames(cx, meta_items));
|
let (ser_name, de_name) = try!(get_renames(cx, meta_items));
|
||||||
field_attrs.serialize_name = ser_name;
|
field_attrs.serialize_name = ser_name;
|
||||||
field_attrs.deserialize_name = de_name;
|
field_attrs.deserialize_name = de_name;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Parse `#[serde(default)]`
|
// Parse `#[serde(default)]`
|
||||||
ast::MetaWord(ref name) if name == &"default" => {
|
ast::MetaItemKind::Word(ref name) if name == &"default" => {
|
||||||
field_attrs.use_default = true;
|
field_attrs.use_default = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Parse `#[serde(skip_serializing)]`
|
// Parse `#[serde(skip_serializing)]`
|
||||||
ast::MetaWord(ref name) if name == &"skip_serializing" => {
|
ast::MetaItemKind::Word(ref name) if name == &"skip_serializing" => {
|
||||||
field_attrs.skip_serializing_field = true;
|
field_attrs.skip_serializing_field = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Parse `#[serde(skip_serializing_if_none)]`
|
// Parse `#[serde(skip_serializing_if_none)]`
|
||||||
ast::MetaWord(ref name) if name == &"skip_serializing_if_none" => {
|
ast::MetaItemKind::Word(ref name) if name == &"skip_serializing_if_none" => {
|
||||||
field_attrs.skip_serializing_field_if_none = true;
|
field_attrs.skip_serializing_field_if_none = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Parse `#[serde(skip_serializing_if_empty)]`
|
// Parse `#[serde(skip_serializing_if_empty)]`
|
||||||
ast::MetaWord(ref name) if name == &"skip_serializing_if_empty" => {
|
ast::MetaItemKind::Word(ref name) if name == &"skip_serializing_if_empty" => {
|
||||||
field_attrs.skip_serializing_field_if_empty = true;
|
field_attrs.skip_serializing_field_if_empty = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -294,11 +294,11 @@ fn get_renames(cx: &ExtCtxt,
|
|||||||
|
|
||||||
for item in items {
|
for item in items {
|
||||||
match item.node {
|
match item.node {
|
||||||
ast::MetaNameValue(ref name, ref lit) if name == &"serialize" => {
|
ast::MetaItemKind::NameValue(ref name, ref lit) if name == &"serialize" => {
|
||||||
ser_name = Some(lit.clone());
|
ser_name = Some(lit.clone());
|
||||||
}
|
}
|
||||||
|
|
||||||
ast::MetaNameValue(ref name, ref lit) if name == &"deserialize" => {
|
ast::MetaItemKind::NameValue(ref name, ref lit) if name == &"deserialize" => {
|
||||||
de_name = Some(lit.clone());
|
de_name = Some(lit.clone());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -318,7 +318,7 @@ fn get_renames(cx: &ExtCtxt,
|
|||||||
|
|
||||||
fn get_serde_meta_items(attr: &ast::Attribute) -> Option<&[P<ast::MetaItem>]> {
|
fn get_serde_meta_items(attr: &ast::Attribute) -> Option<&[P<ast::MetaItem>]> {
|
||||||
match attr.node.value.node {
|
match attr.node.value.node {
|
||||||
ast::MetaList(ref name, ref items) if name == &"serde" => {
|
ast::MetaItemKind::List(ref name, ref items) if name == &"serde" => {
|
||||||
attr::mark_used(&attr);
|
attr::mark_used(&attr);
|
||||||
Some(items)
|
Some(items)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -35,8 +35,8 @@ pub fn expand_derive_deserialize(
|
|||||||
let builder = aster::AstBuilder::new().span(span);
|
let builder = aster::AstBuilder::new().span(span);
|
||||||
|
|
||||||
let generics = match item.node {
|
let generics = match item.node {
|
||||||
ast::ItemStruct(_, ref generics) => generics,
|
ast::ItemKind::Struct(_, ref generics) => generics,
|
||||||
ast::ItemEnum(_, ref generics) => generics,
|
ast::ItemKind::Enum(_, ref generics) => generics,
|
||||||
_ => {
|
_ => {
|
||||||
cx.span_err(
|
cx.span_err(
|
||||||
meta_item.span,
|
meta_item.span,
|
||||||
@@ -88,7 +88,7 @@ fn deserialize_body(
|
|||||||
let container_attrs = try!(attr::ContainerAttrs::from_item(cx, item));
|
let container_attrs = try!(attr::ContainerAttrs::from_item(cx, item));
|
||||||
|
|
||||||
match item.node {
|
match item.node {
|
||||||
ast::ItemStruct(ref variant_data, _) => {
|
ast::ItemKind::Struct(ref variant_data, _) => {
|
||||||
deserialize_item_struct(
|
deserialize_item_struct(
|
||||||
cx,
|
cx,
|
||||||
builder,
|
builder,
|
||||||
@@ -100,7 +100,7 @@ fn deserialize_body(
|
|||||||
&container_attrs,
|
&container_attrs,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
ast::ItemEnum(ref enum_def, _) => {
|
ast::ItemKind::Enum(ref enum_def, _) => {
|
||||||
deserialize_item_enum(
|
deserialize_item_enum(
|
||||||
cx,
|
cx,
|
||||||
builder,
|
builder,
|
||||||
@@ -565,7 +565,7 @@ fn deserialize_item_enum(
|
|||||||
container_attrs,
|
container_attrs,
|
||||||
);
|
);
|
||||||
|
|
||||||
let variants_expr = builder.expr().addr_of().slice()
|
let variants_expr = builder.expr().ref_().slice()
|
||||||
.with_exprs(
|
.with_exprs(
|
||||||
enum_def.variants.iter()
|
enum_def.variants.iter()
|
||||||
.map(|variant| {
|
.map(|variant| {
|
||||||
@@ -943,7 +943,7 @@ fn deserialize_struct_visitor(
|
|||||||
container_attrs,
|
container_attrs,
|
||||||
));
|
));
|
||||||
|
|
||||||
let fields_expr = builder.expr().addr_of().slice()
|
let fields_expr = builder.expr().ref_().slice()
|
||||||
.with_exprs(
|
.with_exprs(
|
||||||
fields.iter()
|
fields.iter()
|
||||||
.map(|field| {
|
.map(|field| {
|
||||||
|
|||||||
+12
-11
@@ -1,5 +1,6 @@
|
|||||||
#![cfg_attr(feature = "clippy", plugin(clippy))]
|
#![cfg_attr(feature = "nightly-testing", plugin(clippy))]
|
||||||
#![cfg_attr(feature = "clippy", allow(used_underscore_binding))]
|
#![cfg_attr(feature = "nightly-testing", feature(plugin))]
|
||||||
|
#![cfg_attr(feature = "nightly-testing", allow(used_underscore_binding))]
|
||||||
#![cfg_attr(not(feature = "with-syntex"), feature(rustc_private, plugin))]
|
#![cfg_attr(not(feature = "with-syntex"), feature(rustc_private, plugin))]
|
||||||
#![cfg_attr(not(feature = "with-syntex"), plugin(quasi_macros))]
|
#![cfg_attr(not(feature = "with-syntex"), plugin(quasi_macros))]
|
||||||
|
|
||||||
@@ -31,14 +32,6 @@ include!("lib.rs.in");
|
|||||||
pub fn register(reg: &mut syntex::Registry) {
|
pub fn register(reg: &mut syntex::Registry) {
|
||||||
use syntax::{ast, fold};
|
use syntax::{ast, fold};
|
||||||
|
|
||||||
reg.add_attr("feature(custom_derive)");
|
|
||||||
reg.add_attr("feature(custom_attribute)");
|
|
||||||
|
|
||||||
reg.add_decorator("derive_Serialize", ser::expand_derive_serialize);
|
|
||||||
reg.add_decorator("derive_Deserialize", de::expand_derive_deserialize);
|
|
||||||
|
|
||||||
reg.add_post_expansion_pass(strip_attributes);
|
|
||||||
|
|
||||||
/// Strip the serde attributes from the crate.
|
/// Strip the serde attributes from the crate.
|
||||||
#[cfg(feature = "with-syntex")]
|
#[cfg(feature = "with-syntex")]
|
||||||
fn strip_attributes(krate: ast::Crate) -> ast::Crate {
|
fn strip_attributes(krate: ast::Crate) -> ast::Crate {
|
||||||
@@ -48,7 +41,7 @@ pub fn register(reg: &mut syntex::Registry) {
|
|||||||
impl fold::Folder for StripAttributeFolder {
|
impl fold::Folder for StripAttributeFolder {
|
||||||
fn fold_attribute(&mut self, attr: ast::Attribute) -> Option<ast::Attribute> {
|
fn fold_attribute(&mut self, attr: ast::Attribute) -> Option<ast::Attribute> {
|
||||||
match attr.node.value.node {
|
match attr.node.value.node {
|
||||||
ast::MetaList(ref n, _) if n == &"serde" => { return None; }
|
ast::MetaItemKind::List(ref n, _) if n == &"serde" => { return None; }
|
||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -62,6 +55,14 @@ pub fn register(reg: &mut syntex::Registry) {
|
|||||||
|
|
||||||
fold::Folder::fold_crate(&mut StripAttributeFolder, krate)
|
fold::Folder::fold_crate(&mut StripAttributeFolder, krate)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
reg.add_attr("feature(custom_derive)");
|
||||||
|
reg.add_attr("feature(custom_attribute)");
|
||||||
|
|
||||||
|
reg.add_decorator("derive_Serialize", ser::expand_derive_serialize);
|
||||||
|
reg.add_decorator("derive_Deserialize", de::expand_derive_deserialize);
|
||||||
|
|
||||||
|
reg.add_post_expansion_pass(strip_attributes);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(not(feature = "with-syntex"))]
|
#[cfg(not(feature = "with-syntex"))]
|
||||||
|
|||||||
@@ -34,8 +34,8 @@ pub fn expand_derive_serialize(
|
|||||||
let builder = aster::AstBuilder::new().span(span);
|
let builder = aster::AstBuilder::new().span(span);
|
||||||
|
|
||||||
let generics = match item.node {
|
let generics = match item.node {
|
||||||
ast::ItemStruct(_, ref generics) => generics,
|
ast::ItemKind::Struct(_, ref generics) => generics,
|
||||||
ast::ItemEnum(_, ref generics) => generics,
|
ast::ItemKind::Enum(_, ref generics) => generics,
|
||||||
_ => {
|
_ => {
|
||||||
cx.span_err(
|
cx.span_err(
|
||||||
meta_item.span,
|
meta_item.span,
|
||||||
@@ -87,7 +87,7 @@ fn serialize_body(
|
|||||||
let container_attrs = try!(attr::ContainerAttrs::from_item(cx, item));
|
let container_attrs = try!(attr::ContainerAttrs::from_item(cx, item));
|
||||||
|
|
||||||
match item.node {
|
match item.node {
|
||||||
ast::ItemStruct(ref variant_data, _) => {
|
ast::ItemKind::Struct(ref variant_data, _) => {
|
||||||
serialize_item_struct(
|
serialize_item_struct(
|
||||||
cx,
|
cx,
|
||||||
builder,
|
builder,
|
||||||
@@ -98,7 +98,7 @@ fn serialize_body(
|
|||||||
&container_attrs,
|
&container_attrs,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
ast::ItemEnum(ref enum_def, _) => {
|
ast::ItemKind::Enum(ref enum_def, _) => {
|
||||||
serialize_item_enum(
|
serialize_item_enum(
|
||||||
cx,
|
cx,
|
||||||
builder,
|
builder,
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "serde_macros"
|
name = "serde_macros"
|
||||||
version = "0.6.11"
|
version = "0.6.12"
|
||||||
authors = ["Erick Tryzelaar <erick.tryzelaar@gmail.com>"]
|
authors = ["Erick Tryzelaar <erick.tryzelaar@gmail.com>"]
|
||||||
license = "MIT/Apache-2.0"
|
license = "MIT/Apache-2.0"
|
||||||
description = "Macros to auto-generate implementations for the serde framework"
|
description = "Macros to auto-generate implementations for the serde framework"
|
||||||
@@ -16,14 +16,14 @@ plugin = true
|
|||||||
nightly-testing = ["clippy", "serde/nightly-testing", "serde_codegen/nightly-testing"]
|
nightly-testing = ["clippy", "serde/nightly-testing", "serde_codegen/nightly-testing"]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
clippy = { version = "^0.0.37", optional = true }
|
clippy = { version = "^0.0.39", optional = true }
|
||||||
serde_codegen = { version = "^0.6.10", path = "../serde_codegen", default-features = false, features = ["nightly"] }
|
serde_codegen = { version = "^0.6.12", path = "../serde_codegen", default-features = false, features = ["nightly"] }
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
compiletest_rs = "^0.0.11"
|
compiletest_rs = "^0.0.11"
|
||||||
num = "^0.1.27"
|
num = "^0.1.27"
|
||||||
rustc-serialize = "^0.3.16"
|
rustc-serialize = "^0.3.16"
|
||||||
serde = { version = "^0.6.10", path = "../serde", features = ["num-impls"] }
|
serde = { version = "^0.6.12", path = "../serde", features = ["num-impls"] }
|
||||||
|
|
||||||
[[test]]
|
[[test]]
|
||||||
name = "test"
|
name = "test"
|
||||||
|
|||||||
@@ -14,18 +14,18 @@ build = "build.rs"
|
|||||||
nightly-testing = ["clippy", "serde/nightly-testing", "serde_codegen/nightly-testing"]
|
nightly-testing = ["clippy", "serde/nightly-testing", "serde_codegen/nightly-testing"]
|
||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
syntex = { version = "^0.26.0" }
|
syntex = { version = "^0.27.0" }
|
||||||
syntex_syntax = { version = "^0.26.0" }
|
syntex_syntax = { version = "^0.27.0" }
|
||||||
serde_codegen = { version = "*", path = "../serde_codegen", features = ["with-syntex"] }
|
serde_codegen = { version = "^0.6.12", path = "../serde_codegen", features = ["with-syntex"] }
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
num = "^0.1.27"
|
num = "^0.1.26"
|
||||||
rustc-serialize = "^0.3.16"
|
rustc-serialize = "^0.3.16"
|
||||||
serde = { version = "*", path = "../serde", features = ["num-impls"] }
|
serde = { version = "*", path = "../serde", features = ["num-impls"] }
|
||||||
syntex = "^0.26.0"
|
syntex = "^0.27.0"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
clippy = { version = "^0.0.37", optional = true }
|
clippy = { version = "^0.0.39", optional = true }
|
||||||
|
|
||||||
[[test]]
|
[[test]]
|
||||||
name = "test"
|
name = "test"
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ use num::rational::Ratio;
|
|||||||
|
|
||||||
use serde::de::{Deserializer, Visitor};
|
use serde::de::{Deserializer, Visitor};
|
||||||
|
|
||||||
use token::{Error, Token, assert_de_tokens, assert_de_tokens_ignore};
|
use token::{Token, assert_de_tokens, assert_de_tokens_ignore};
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user