ellie_parser 0.8.3

Parser for ellie language
Documentation
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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
use crate::{
    deep_search_extensions::{deep_search_hash, resolve_type},
    processors::types::{TypeParserProcessor, TypeParserProcessorOptions},
};
use alloc::{borrow::ToOwned, vec, vec::Vec};
use ellie_core::{definite::Converter, error};
use ellie_tokenizer::syntax::{
    items::setter_call::SetterCall,
    types::operator_type::{AssignmentOperators, Operators},
};

impl super::ItemParserProcessor for SetterCall {
    fn process(&self, options: &mut super::ItemParserProcessorOptions) -> bool {
        let current_page = options
            .parser
            .pages
            .nth(options.page_idx)
            .unwrap_or_else(|| panic!("Failed to find page"))
            .clone();

        match self.target.process(
            TypeParserProcessorOptions::new(options.parser, options.page_hash)
                .include_setter()
                .exclude_getter()
                .variable_pos(self.target_pos)
                .build(),
        ) {
            Ok(target) => match target.clone() {
                ellie_core::definite::types::Types::Reference(_) => {
                    match self.value.process(
                        TypeParserProcessorOptions::new(options.parser, options.page_hash)
                            .exclude_getter()
                            .variable_pos(self.target_pos)
                            .build(),
                    ) {
                        Ok(processed_value_type) => {
                            let mut errors = Vec::new();
                            let target_type = match resolve_type(
                                target.clone(),
                                options.page_hash,
                                options.parser,
                                &mut errors,
                                Some(self.target_pos),
                            ) {
                                Some(e) => e,
                                None => {
                                    options.parser.informations.extend(&errors);
                                    return false;
                                }
                            };

                            let value_defining = match resolve_type(
                                processed_value_type.clone(),
                                options.page_hash,
                                options.parser,
                                &mut errors,
                                Some(self.target_pos),
                            ) {
                                Some(e) => e,
                                None => {
                                    options.parser.informations.extend(&errors);
                                    return false;
                                }
                            };

                            let first = target_type.to_string();
                            let second = value_defining.to_string();

                            match ellie_core::utils::operator_control(
                                Operators::AssignmentType(self.operator.clone()).to_definite(),
                                first,
                                second,
                                current_page.path,
                                self.value_pos,
                            ) {
                                Some(e) => {
                                    options.parser.informations.push(&e);
                                    return false;
                                }
                                None => {
                                    let page = options
                                        .parser
                                        .processed_pages
                                        .nth_mut(options.processed_page_idx)
                                        .unwrap();
                                    page.items.push(ellie_core::definite::items::Collecting::SetterCall(
                                            ellie_core::definite::items::setter_call::SetterCall {
                                                target,
                                                hash: self.hash,
                                                value: processed_value_type,
                                                target_pos: self.target_pos,
                                                value_pos: self.value_pos,
                                                operator: match self.operator  {
                                                    AssignmentOperators::Assignment => ellie_core::definite::types::operator::AssignmentOperators::Assignment,
                                                    AssignmentOperators::AdditionAssignment => ellie_core::definite::types::operator::AssignmentOperators::AdditionAssignment,
                                                    AssignmentOperators::SubtractionAssignment => ellie_core::definite::types::operator::AssignmentOperators::SubtractionAssignment,
                                                    AssignmentOperators::MultiplicationAssignment => ellie_core::definite::types::operator::AssignmentOperators::MultiplicationAssignment,
                                                    AssignmentOperators::DivisionAssignment => ellie_core::definite::types::operator::AssignmentOperators::DivisionAssignment,
                                                    AssignmentOperators::ModulusAssignment => ellie_core::definite::types::operator::AssignmentOperators::ModulusAssignment,
                                                    AssignmentOperators::ExponentiationAssignment => ellie_core::definite::types::operator::AssignmentOperators::ExponentiationAssignment,
                                                    AssignmentOperators::Null => ellie_core::definite::types::operator::AssignmentOperators::Null,
                                                },
                                            },
                                        ));
                                }
                            }
                        }
                        Err(e) => {
                            options.parser.informations.extend(&e);
                        }
                    };
                }
                ellie_core::definite::types::Types::BraceReference(_) => {
                    match self.value.process(
                        TypeParserProcessorOptions::new(options.parser, options.page_hash)
                            .variable_pos(self.target_pos)
                            .build(),
                    ) {
                        Ok(processed_value_type) => {
                            let mut errors = Vec::new();
                            let mut target_type = match resolve_type(
                                processed_value_type.clone(),
                                options.page_hash,
                                options.parser,
                                &mut errors,
                                Some(self.target_pos),
                            ) {
                                Some(e) => e,
                                None => {
                                    options.parser.informations.extend(&errors);
                                    return true;
                                }
                            };

                            if matches!(target_type.clone(), ellie_core::definite::definers::DefinerCollecting::ParentGeneric(e) if e.rtype == "nullAble")
                            {
                                target_type = target_type.as_parent_generic().unwrap().generics[0]
                                    .clone()
                                    .value;
                            }

                            let value_defining = match resolve_type(
                                processed_value_type.clone(),
                                options.page_hash,
                                options.parser,
                                &mut errors,
                                Some(self.target_pos),
                            ) {
                                Some(e) => e,
                                None => {
                                    options.parser.informations.extend(&errors);
                                    return false;
                                }
                            };

                            let first = target_type.to_string();
                            let second = value_defining.to_string();

                            match ellie_core::utils::operator_control(
                                Operators::AssignmentType(self.operator.clone()).to_definite(),
                                first,
                                second,
                                current_page.path.clone(),
                                self.value_pos,
                            ) {
                                Some(e) => {
                                    errors.push(e);
                                    options.parser.informations.extend(&errors);
                                    return false;
                                }
                                None => {
                                    let page = options
                                        .parser
                                        .processed_pages
                                        .nth_mut(options.processed_page_idx)
                                        .unwrap();
                                    page.items.push(ellie_core::definite::items::Collecting::SetterCall(
                                            ellie_core::definite::items::setter_call::SetterCall {
                                                target,
                                                hash: self.hash,
                                                value: processed_value_type,
                                                target_pos: self.target_pos,
                                                value_pos: self.value_pos,
                                                operator: match self.operator  {
                                                    AssignmentOperators::Assignment => ellie_core::definite::types::operator::AssignmentOperators::Assignment,
                                                    AssignmentOperators::AdditionAssignment => ellie_core::definite::types::operator::AssignmentOperators::AdditionAssignment,
                                                    AssignmentOperators::SubtractionAssignment => ellie_core::definite::types::operator::AssignmentOperators::SubtractionAssignment,
                                                    AssignmentOperators::MultiplicationAssignment => ellie_core::definite::types::operator::AssignmentOperators::MultiplicationAssignment,
                                                    AssignmentOperators::DivisionAssignment => ellie_core::definite::types::operator::AssignmentOperators::DivisionAssignment,
                                                    AssignmentOperators::ModulusAssignment => ellie_core::definite::types::operator::AssignmentOperators::ModulusAssignment,
                                                    AssignmentOperators::ExponentiationAssignment => ellie_core::definite::types::operator::AssignmentOperators::ExponentiationAssignment,
                                                    AssignmentOperators::Null => ellie_core::definite::types::operator::AssignmentOperators::Null,
                                                },
                                            },
                                        ));
                                }
                            }
                        }
                        Err(e) => {
                            options.parser.informations.extend(&e);
                        }
                    };
                }
                ellie_core::definite::types::Types::VariableType(variable_reference) => {
                    let deep_type = deep_search_hash(
                        options.parser,
                        options.page_hash,
                        variable_reference.reference,
                        vec![],
                        0,
                    );
                    if deep_type.found {
                        match deep_type.found_item {
                            crate::deep_search_extensions::ProcessedDeepSearchItems::Variable(
                                variable,
                            ) => {
                                if variable.constant {
                                    options.parser.informations.push(
                                        &ellie_core::error::error_list::ERROR_S18
                                            .clone()
                                            .build_with_path(
                                                vec![],
                                                alloc::format!(
                                                    "{}:{}:{}",
                                                    file!().to_owned(),
                                                    line!(),
                                                    column!()
                                                ),
                                                current_page.path.clone(),
                                                self.target_pos,
                                            ),
                                    );
                                } else {
                                    match self.value.process(
                                        TypeParserProcessorOptions::new(
                                            options.parser,
                                            options.page_hash,
                                        )
                                        .variable_pos(self.target_pos)
                                        .build(),
                                    ) {
                                        Ok(processed_value_type) => {
                                            let mut errors = Vec::new();

                                            let target_type = if variable.has_type {
                                                variable.rtype
                                            } else {
                                                match resolve_type(
                                                    variable.value,
                                                    options.page_hash,
                                                    options.parser,
                                                    &mut errors,
                                                    Some(variable.value_pos),
                                                ) {
                                                    Some(e) => e,
                                                    None => {
                                                        options.parser.informations.extend(&errors);
                                                        return false;
                                                    }
                                                }
                                            };

                                            let value_defining = match resolve_type(
                                                processed_value_type.clone(),
                                                options.page_hash,
                                                options.parser,
                                                &mut errors,
                                                Some(self.target_pos),
                                            ) {
                                                Some(e) => e,
                                                None => {
                                                    options.parser.informations.extend(&errors);
                                                    return false;
                                                }
                                            };

                                            let first = target_type.to_string();
                                            let second = value_defining.to_string();

                                            match ellie_core::utils::operator_control(
                                                Operators::AssignmentType(self.operator.clone())
                                                    .to_definite(),
                                                first,
                                                second,
                                                current_page.path.clone(),
                                                self.value_pos,
                                            ) {
                                                Some(e) => {
                                                    errors.push(e);
                                                    options.parser.informations.extend(&errors);
                                                    return false;
                                                }
                                                None => {
                                                    let page = options
                                                        .parser
                                                        .processed_pages
                                                        .nth_mut(options.processed_page_idx)
                                                        .unwrap();
                                                    page.items.push(ellie_core::definite::items::Collecting::SetterCall(
                                                            ellie_core::definite::items::setter_call::SetterCall {
                                                                target,
                                                                hash: self.hash,
                                                                value: processed_value_type,
                                                                target_pos: self.target_pos,
                                                                value_pos: self.value_pos,
                                                                operator: match self.operator  {
                                                                    AssignmentOperators::Assignment => ellie_core::definite::types::operator::AssignmentOperators::Assignment,
                                                                    AssignmentOperators::AdditionAssignment => ellie_core::definite::types::operator::AssignmentOperators::AdditionAssignment,
                                                                    AssignmentOperators::SubtractionAssignment => ellie_core::definite::types::operator::AssignmentOperators::SubtractionAssignment,
                                                                    AssignmentOperators::MultiplicationAssignment => ellie_core::definite::types::operator::AssignmentOperators::MultiplicationAssignment,
                                                                    AssignmentOperators::DivisionAssignment => ellie_core::definite::types::operator::AssignmentOperators::DivisionAssignment,
                                                                    AssignmentOperators::ModulusAssignment => ellie_core::definite::types::operator::AssignmentOperators::ModulusAssignment,
                                                                    AssignmentOperators::ExponentiationAssignment => ellie_core::definite::types::operator::AssignmentOperators::ExponentiationAssignment,
                                                                    AssignmentOperators::Null => ellie_core::definite::types::operator::AssignmentOperators::Null,
                                                                },
                                                            },
                                                        ));
                                                }
                                            }
                                        }
                                        Err(e) => {
                                            options.parser.informations.extend(&e);
                                        }
                                    }
                                }
                            }
                            _ => {
                                unreachable!("options.parser should have prevented this");
                            }
                        }
                    } else {
                        unreachable!("options.parser should have prevented this");
                    }
                }
                ellie_core::definite::types::Types::SetterCall(_) => {
                    match self.value.process(
                        TypeParserProcessorOptions::new(options.parser, options.page_hash)
                            .variable_pos(self.target_pos)
                            .build(),
                    ) {
                        Ok(processed_value_type) => {
                            let mut errors = Vec::new();
                            let target_type = match resolve_type(
                                target.clone(),
                                options.page_hash,
                                options.parser,
                                &mut errors,
                                Some(self.target_pos),
                            ) {
                                Some(e) => e,
                                None => {
                                    options.parser.informations.extend(&errors);
                                    return false;
                                }
                            };

                            let value_defining = match resolve_type(
                                processed_value_type.clone(),
                                options.page_hash,
                                options.parser,
                                &mut errors,
                                Some(self.target_pos),
                            ) {
                                Some(e) => e,
                                None => {
                                    options.parser.informations.extend(&errors);
                                    return false;
                                }
                            };

                            let first = target_type.to_string();
                            let second = value_defining.to_string();

                            match ellie_core::utils::operator_control(
                                Operators::AssignmentType(self.operator.clone()).to_definite(),
                                first,
                                second,
                                current_page.path,
                                self.value_pos,
                            ) {
                                Some(e) => {
                                    options.parser.informations.push(&e);
                                    return false;
                                }
                                None => {
                                    let page = options
                                        .parser
                                        .processed_pages
                                        .nth_mut(options.processed_page_idx)
                                        .unwrap();
                                    page.items.push(ellie_core::definite::items::Collecting::SetterCall(
                                            ellie_core::definite::items::setter_call::SetterCall {
                                                target,
                                                value: processed_value_type,
                                                target_pos: self.target_pos,
                                                hash: self.hash,
                                                value_pos: self.value_pos,
                                                operator: match self.operator  {
                                                    AssignmentOperators::Assignment => ellie_core::definite::types::operator::AssignmentOperators::Assignment,
                                                    AssignmentOperators::AdditionAssignment => ellie_core::definite::types::operator::AssignmentOperators::AdditionAssignment,
                                                    AssignmentOperators::SubtractionAssignment => ellie_core::definite::types::operator::AssignmentOperators::SubtractionAssignment,
                                                    AssignmentOperators::MultiplicationAssignment => ellie_core::definite::types::operator::AssignmentOperators::MultiplicationAssignment,
                                                    AssignmentOperators::DivisionAssignment => ellie_core::definite::types::operator::AssignmentOperators::DivisionAssignment,
                                                    AssignmentOperators::ModulusAssignment => ellie_core::definite::types::operator::AssignmentOperators::ModulusAssignment,
                                                    AssignmentOperators::ExponentiationAssignment => ellie_core::definite::types::operator::AssignmentOperators::ExponentiationAssignment,
                                                    AssignmentOperators::Null => ellie_core::definite::types::operator::AssignmentOperators::Null,
                                                },
                                            },
                                        ));
                                }
                            }
                        }
                        Err(e) => {
                            options.parser.informations.extend(&e);
                        }
                    }
                }
                ellie_core::definite::types::Types::FunctionParameter(_) => {
                    options.parser.informations.push(
                        &ellie_core::error::error_list::ERROR_S59
                            .clone()
                            .build_with_path(
                                vec![error::ErrorBuildField {
                                    key: "token".to_owned(),
                                    value: "Mutatable Function Parameters".to_owned(),
                                }],
                                alloc::format!("{}:{}:{}", file!().to_owned(), line!(), column!()),
                                current_page.path.clone(),
                                self.target_pos,
                            ),
                    );
                }
                _ => {
                    options.parser.informations.push(
                        &ellie_core::error::error_list::ERROR_S43
                            .clone()
                            .build_with_path(
                                vec![],
                                alloc::format!("{}:{}:{}", file!().to_owned(), line!(), column!()),
                                current_page.path.clone(),
                                self.target_pos,
                            ),
                    );
                }
            },
            Err(e) => {
                options.parser.informations.extend(&e);
            }
        }
        true
    }
}