1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
// use std::fmt::{Display, Formatter};
// use quote::{quote, ToTokens};
// use syn::__private::TokenStream2;
// use crate::composable::FieldComposer;
// use crate::lang::objc::{ObjCFermentate, ObjCSpecification};
// use crate::presentable::{Aspect, ScopeContextPresentable};
//
//
// #[derive(Clone, Debug)]
// pub enum Property {
// NonatomicReadwrite { ty: TokenStream2, name: TokenStream2 },
// NonatomicAssign { ty: TokenStream2, name: TokenStream2 },
// Initializer { field_name: TokenStream2, field_initializer: TokenStream2 },
// // AccInitialized { field_name: TokenStream2, var: TokenStream2, field_initializer: TokenStream2 }
// }
//
// impl Property {
// pub fn nonatomic_readwrite<SPEC>(composer: &FieldComposer<ObjCFermentate, SPEC>) -> Self
// where SPEC: ObjCSpecification {
// let FieldComposer { kind, name, .. } = composer;
// Property::NonatomicReadwrite {
// ty: kind.to_token_stream(),
// name: name.to_token_stream()
// }
// }
// pub fn nonatomic_assign<SPEC>(composer: &FieldComposer<ObjCFermentate, SPEC>) -> Self
// where SPEC: ObjCSpecification {
// let FieldComposer { kind, name, .. } = composer;
// Property::NonatomicAssign {
// ty: kind.to_token_stream(),
// name: name.to_token_stream()
// }
// }
// pub fn initializer<SPEC>(composer: &FieldComposer<ObjCFermentate, SPEC>) -> Self
// where SPEC: ObjCSpecification {
// Property::Initializer {
// field_name: composer.tokenized_name(),
// field_initializer: composer.to_token_stream()
// }
// }
// }
//
// // impl<SPEC> ToTokens for FieldComposer<ObjCFermentate, SPEC>
// // where SPEC: Specification<ObjCFermentate, Attr=AttrWrapper, Gen=Option<Generics>> {
// // #[allow(unused_variables)]
// // fn to_tokens(&self, tokens: &mut TokenStream2) {
// // let Self { name, kind, attrs, .. } = self;
// //
// // let template = quote! {
// // //#ifdef SMTH
// // //#(#attrs)*
// // #name: #kind
// // //#endif SMTH
// //
// // };
// // template.to_tokens(tokens)
// // }
// // }
// //
//
//
// impl ToTokens for Property {
// fn to_tokens(&self, tokens: &mut TokenStream2) {
// match self {
// Property::NonatomicReadwrite { ty, name } => {
// quote! {
// @property (nonatomic, readwrite) #ty #name
// }
// }
// Property::NonatomicAssign { ty, name } => {
// quote! {
// @property (nonatomic, assign) #ty #name
// }
// }
// Property::Initializer { field_name, field_initializer } => {
// quote! {
// obj.#field_name = #field_initializer
// }
// }
// // Property::AccInitialized { field_name, var, field_initializer } => {
// // quote! {
// // #var #field_name = #field_initializer
// // }
// // }
// }.to_tokens(tokens)
// }
// }
//
// impl Display for Property {
// fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
// f.write_str(match self {
// Property::NonatomicReadwrite { ty, name } =>
// format!("@property (nonatomic, readwrite) {} {}", ty.to_string(), name.to_string()),
// Property::NonatomicAssign { ty, name } =>
// format!("@property (nonatomic, assign) {} {}", ty.to_string(), name.to_string()),
// Property::Initializer { field_name, field_initializer } =>
// format!("obj.{} = {}", field_name.to_string(), field_initializer.to_string()),
// // Property::AccInitialized { field_name, var, field_initializer } =>
// // format!("{} {} = {}", var.to_string(), field_name.to_string(), field_initializer.to_string()),
// }.as_str())
// }
// }
//
// // #[derive(Clone, Debug)]
// // pub enum MethodDeclaration {
// // InitWith { c_type: TokenStream2 }
// // }
//
// impl<SPEC> From<&FieldComposer<ObjCFermentate, SPEC>> for Property
// where SPEC: ObjCSpecification,
// Aspect<SPEC::TYC>: ScopeContextPresentable {
// fn from(value: &FieldComposer<ObjCFermentate, SPEC>) -> Self {
// Property::NonatomicReadwrite {
// ty: value.ty().to_token_stream(),
// name: value.name.to_token_stream()
// }
// }
// }