From 11610e1df66214a1bf58bff2565b52d270bf0d5b Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Thu, 29 Nov 2018 20:51:50 -0800 Subject: [PATCH] Eliminate deserializer lifetime on PropertySheet The PropertySheet is intended to be a long-lived object, whereas its JSON source is not needed once the property sheet is instantiated. Co-Authored-By: Timothy Clem --- src/lib.rs | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 68715879..681af7fb 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -6,7 +6,7 @@ extern crate serde_json; extern crate regex; extern crate serde; -use serde::Deserialize; +use serde::de::DeserializeOwned; use regex::Regex; use std::collections::HashMap; use std::ffi::CStr; @@ -63,10 +63,9 @@ pub enum PropertySheetError { InvalidRegex(regex::Error) } -pub struct PropertySheet<'d, P: Deserialize<'d>> { +pub struct PropertySheet> { states: Vec, property_sets: Vec

, - _phantom: &'d std::marker::PhantomData<()>, } pub struct Node<'a>(ffi::TSNode, PhantomData<&'a ()>); @@ -77,11 +76,11 @@ pub struct Tree(*mut ffi::TSTree); pub struct TreeCursor<'a>(ffi::TSTreeCursor, PhantomData<&'a ()>); -pub struct TreePropertyCursor<'a, 'd, P: Deserialize<'d>> { +pub struct TreePropertyCursor<'a, P: 'a + DeserializeOwned> { cursor: TreeCursor<'a>, state_stack: Vec, child_index_stack: Vec, - property_sheet: &'a PropertySheet<'d, P>, + property_sheet: &'a PropertySheet

, source: &'a str, } @@ -353,11 +352,11 @@ impl Tree { self.root_node().walk() } - pub fn walk_with_properties<'a, 'd, P: Deserialize<'d>>( + pub fn walk_with_properties<'a, P: DeserializeOwned>( &'a self, - property_sheet: &'a PropertySheet<'d, P>, + property_sheet: &'a PropertySheet

, source: &'a str, - ) -> TreePropertyCursor<'a, 'd, P> { + ) -> TreePropertyCursor<'a, P> { TreePropertyCursor::new(self, property_sheet, source) } } @@ -548,8 +547,8 @@ impl<'a> Drop for TreeCursor<'a> { } } -impl<'a, 'd, P: Deserialize<'d>> TreePropertyCursor<'a, 'd, P> { - fn new(tree: &'a Tree, property_sheet: &'a PropertySheet<'d, P>, source: &'a str) -> Self { +impl<'a, P: DeserializeOwned> TreePropertyCursor<'a, P> { + fn new(tree: &'a Tree, property_sheet: &'a PropertySheet

, source: &'a str) -> Self { Self { cursor: tree.root_node().walk(), child_index_stack: vec![0], @@ -674,8 +673,8 @@ impl From for Point { } } -impl<'a, P: Deserialize<'a>> PropertySheet<'a, P> { - pub fn new(language: Language, json: &'a str) -> Result { +impl PropertySheet

{ + pub fn new(language: Language, json: &str) -> Result { #[derive(Deserialize, Debug)] struct PropertyTransitionJSON { #[serde(rename = "type")] @@ -735,7 +734,6 @@ impl<'a, P: Deserialize<'a>> PropertySheet<'a, P> { Ok(Self { property_sets: input.property_sets, states, - _phantom: &std::marker::PhantomData, }) } }