expressir 2.1.12 → 2.1.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,1547 @@
1
+ = Expressir Liquid drop attributes
2
+ :toc:
3
+
4
+ == Introduction
5
+
6
+ == Identifier functionality
7
+
8
+ Many EXPRESS model elements have an identifier and associated documentation. In Expressir, this is implemented through the `IdentifierDrop` module. When a drop class includes this module and calls `initialize_identifier`, it automatically gets the following attributes:
9
+
10
+ `id`:: The identifier name of the element
11
+ `remarks`:: Array of remarks (comments) associated with the element
12
+ `remark_items`:: Array of structured remarks as RemarkItemDrop objects
13
+ `source`:: The original source code representation
14
+
15
+ The following drops include Identifier functionality:
16
+
17
+ * Schema drops
18
+ * Type drops
19
+ * Entity drops
20
+ * Function drops
21
+ * Procedure drops
22
+ * Attribute drops
23
+ * Constant drops
24
+ * Variable drops
25
+ * Parameter drops
26
+ * Rule drops
27
+ * Where rule drops
28
+ * Unique rule drops
29
+ * Subtype constraint drops
30
+ * Generic drops
31
+ * Generic entity drops
32
+ * Enumeration item drops
33
+ * Aggregate drops
34
+ * Query expression drops
35
+ * Alias statement drops
36
+
37
+ Each of these drops will have the above attributes in addition to their specific attributes.
38
+
39
+ Example using identifier attributes:
40
+
41
+ [source,liquid]
42
+ ----
43
+ Name: {{ item.id }}
44
+
45
+ {% if item.remarks.size > 0 %}
46
+ Documentation:
47
+ {% for remark in item.remarks %}
48
+ * {{ remark }}
49
+ {% endfor %}
50
+ {% endif %}
51
+
52
+ {% if item.remark_items.size > 0 %}
53
+ Structured Documentation:
54
+ {% for ritem in item.remark_items %}
55
+ * {{ ritem.id }}: {{ ritem.remarks | join: " " }}
56
+ {% endfor %}
57
+ {% endif %}
58
+
59
+ Source:
60
+ {{ item.source }}
61
+ ----
62
+
63
+ === Identifier implementation details
64
+
65
+ The identifier functionality is implemented in the `IdentifierDrop` module located in `lib/expressir/liquid/identifier_drop.rb`. Classes include this module and call `initialize_identifier` in their initializer to get the standard identifier attributes.
66
+
67
+ Example implementation pattern:
68
+
69
+ [source,ruby]
70
+ ----
71
+ class MyDrop < ModelElementDrop
72
+ include IdentifierDrop
73
+
74
+ def initialize(model)
75
+ super
76
+ initialize_identifier
77
+ end
78
+ end
79
+ ----
80
+
81
+ === Error handling with identifier attributes
82
+
83
+ When working with identifier attributes, consider these error handling patterns:
84
+
85
+ [source,liquid]
86
+ ----
87
+ {% if item %}
88
+ {% if item.id %}{{ item.id }}{% else %}[Unnamed]{% endif %}
89
+ {% else %}
90
+ [Invalid Item]
91
+ {% endif %}
92
+
93
+ {% if item and item.remarks %}
94
+ {% for remark in item.remarks %}
95
+ - {{ remark }}
96
+ {% endfor %}
97
+ {% endif %}
98
+
99
+ {% if item and item.source %}{{ item.source }}{% else %}[No Source Available]{% endif %}
100
+ ----
101
+
102
+ == Drop categories and attributes
103
+
104
+ === Base drops
105
+
106
+ ==== ModelElementDrop
107
+
108
+ Base class for all drops.
109
+
110
+ Attributes:
111
+
112
+ `_class`:: Returns the class name of the model
113
+ `file`:: Returns the file path if the model responds to it
114
+ `source`:: Returns the source if the model responds to it
115
+
116
+ ==== DeclarationDrop
117
+
118
+ Inherits from ModelElementDrop.
119
+
120
+ === Repository and schema drops
121
+
122
+ ==== RepositoryDrop
123
+
124
+ Represents the root container for schemas.
125
+
126
+ Attributes:
127
+
128
+ `schemas`:: Array of SchemaDrop objects
129
+
130
+ ==== SchemaDrop
131
+
132
+ Represents an EXPRESS SCHEMA declaration. Includes identifier functionality.
133
+
134
+ Attributes:
135
+
136
+ `id`:: Schema name
137
+ `remarks`:: Array of remarks
138
+ `remark_items`:: Array of RemarkItemDrop objects
139
+ `source`:: Source code representation
140
+ `file`:: Schema file path
141
+ `file_basename`:: Base name of schema file
142
+ `selected`:: Boolean indicating if schema is selected
143
+ `relative_path_prefix`:: Relative path prefix for document
144
+ `version`:: SchemaVersionDrop object
145
+ `interfaces`:: Array of InterfaceDrop objects
146
+ `constants`:: Array of ConstantDrop objects
147
+ `types`:: Array of TypeDrop objects
148
+ `entities`:: Array of EntityDrop objects
149
+ `subtype_constraints`:: Array of SubtypeConstraintDrop objects
150
+ `functions`:: Array of FunctionDrop objects
151
+ `rules`:: Array of RuleDrop objects
152
+ `procedures`:: Array of ProcedureDrop objects
153
+ `formatted`:: Formatted string representation
154
+
155
+ ==== SchemaVersionDrop
156
+
157
+ Represents schema version information.
158
+
159
+ Attributes:
160
+
161
+ `value`:: Version string value
162
+ `items`:: Array of SchemaVersionItemDrop objects
163
+
164
+ ==== SchemaVersionItemDrop
165
+
166
+ Represents individual version items.
167
+
168
+ Attributes:
169
+
170
+ `name`:: Item name
171
+ `value`:: Item value
172
+
173
+ === Interface drops
174
+
175
+ ==== InterfaceDrop
176
+
177
+ Represents schema interfaces (USE FROM and REFERENCE FROM).
178
+
179
+ Attributes:
180
+
181
+ `kind`:: Interface kind ('use' or 'reference')
182
+ `schema`:: Reference to schema being interfaced
183
+ `items`:: Array of InterfaceItemDrop objects
184
+
185
+ ==== InterfaceItemDrop
186
+
187
+ Represents items in an interface.
188
+
189
+ Attributes:
190
+
191
+ `ref`:: Reference to the interfaced item
192
+ `id`:: Identifier name
193
+
194
+ ==== InterfacedItemDrop
195
+
196
+ Represents an item that has been interfaced.
197
+
198
+ Attributes:
199
+
200
+ `id`:: Identifier name
201
+ `remarks`:: Array of remarks
202
+ `remark_items`:: Array of RemarkItemDrop objects
203
+ `base_item`:: Reference to the original item
204
+
205
+ === Declaration drops
206
+
207
+ ==== AttributeDrop
208
+
209
+ Represents an entity attribute. Includes identifier functionality.
210
+
211
+ Attributes:
212
+
213
+ `id`:: Attribute name
214
+ `remarks`:: Array of remarks
215
+ `remark_items`:: Array of RemarkItemDrop objects
216
+ `source`:: Source code representation
217
+ `kind`:: Kind of attribute (explicit, derived, inverse)
218
+ `supertype_attribute`:: Reference to attribute in supertype if inherited
219
+ `optional`:: Boolean indicating if attribute is optional
220
+ `type`:: DataTypeDrop representing attribute type
221
+ `expression`:: ExpressionDrop for derived attributes
222
+
223
+ ==== ConstantDrop
224
+
225
+ Represents schema-level constants. Includes identifier functionality.
226
+
227
+ Attributes:
228
+
229
+ `id`:: Constant name
230
+ `remarks`:: Array of remarks
231
+ `remark_items`:: Array of RemarkItemDrop objects
232
+ `source`:: Source code representation
233
+ `type`:: DataTypeDrop representing constant type
234
+ `expression`:: ExpressionDrop representing constant value
235
+
236
+ ==== EntityDrop
237
+
238
+ Represents an EXPRESS entity. Includes identifier functionality.
239
+
240
+ Attributes:
241
+
242
+ `id`:: Entity name
243
+ `remarks`:: Array of remarks
244
+ `remark_items`:: Array of RemarkItemDrop objects
245
+ `source`:: Source code representation
246
+ `abstract`:: Boolean indicating if entity is abstract
247
+ `supertype_expression`:: SupertypeExpressionDrop
248
+ `subtype_of`:: Array of references to supertypes
249
+ `attributes`:: Array of AttributeDrop objects
250
+ `unique_rules`:: Array of UniqueRuleDrop objects
251
+ `where_rules`:: Array of WhereRuleDrop objects
252
+ `informal_propositions`:: Array of RemarkItemDrop objects
253
+
254
+ ==== FunctionDrop
255
+
256
+ Represents an EXPRESS function. Includes identifier functionality.
257
+
258
+ Attributes:
259
+
260
+ `id`:: Function name
261
+ `remarks`:: Array of remarks
262
+ `remark_items`:: Array of RemarkItemDrop objects
263
+ `source`:: Source code representation
264
+ `parameters`:: Array of ParameterDrop objects
265
+ `return_type`:: DataTypeDrop representing return type
266
+ `types`:: Array of TypeDrop objects
267
+ `entities`:: Array of EntityDrop objects
268
+ `subtype_constraints`:: Array of SubtypeConstraintDrop objects
269
+ `functions`:: Array of FunctionDrop objects
270
+ `procedures`:: Array of ProcedureDrop objects
271
+ `constants`:: Array of ConstantDrop objects
272
+ `variables`:: Array of VariableDrop objects
273
+ `statements`:: Array of StatementDrop objects
274
+
275
+ ==== ParameterDrop
276
+
277
+ Represents function/procedure parameters. Includes identifier functionality.
278
+
279
+ Attributes:
280
+
281
+ `id`:: Parameter name
282
+ `remarks`:: Array of remarks
283
+ `remark_items`:: Array of RemarkItemDrop objects
284
+ `source`:: Source code representation
285
+ `var`:: Boolean indicating if parameter is VAR (variable)
286
+ `type`:: DataTypeDrop representing parameter type
287
+
288
+ ==== ProcedureDrop
289
+
290
+ Represents an EXPRESS procedure. Includes identifier functionality.
291
+
292
+ Attributes:
293
+
294
+ `id`:: Procedure name
295
+ `remarks`:: Array of remarks
296
+ `remark_items`:: Array of RemarkItemDrop objects
297
+ `source`:: Source code representation
298
+ `parameters`:: Array of ParameterDrop objects
299
+ `types`:: Array of TypeDrop objects
300
+ `entities`:: Array of EntityDrop objects
301
+ `subtype_constraints`:: Array of SubtypeConstraintDrop objects
302
+ `functions`:: Array of FunctionDrop objects
303
+ `procedures`:: Array of ProcedureDrop objects
304
+ `constants`:: Array of ConstantDrop objects
305
+ `variables`:: Array of VariableDrop objects
306
+ `statements`:: Array of StatementDrop objects
307
+
308
+ ==== RemarkItemDrop
309
+
310
+ Represents structured remarks.
311
+
312
+ Attributes:
313
+
314
+ `id`:: Remark identifier
315
+ `remarks`:: Array of remark content strings
316
+
317
+ ==== RuleDrop
318
+
319
+ Represents EXPRESS global rules. Includes identifier functionality.
320
+
321
+ Attributes:
322
+
323
+ `id`:: Rule name
324
+ `remarks`:: Array of remarks
325
+ `remark_items`:: Array of RemarkItemDrop objects
326
+ `source`:: Source code representation
327
+ `applies_to`:: Array of references to entities rule applies to
328
+ `types`:: Array of TypeDrop objects
329
+ `entities`:: Array of EntityDrop objects
330
+ `subtype_constraints`:: Array of SubtypeConstraintDrop objects
331
+ `functions`:: Array of FunctionDrop objects
332
+ `procedures`:: Array of ProcedureDrop objects
333
+ `constants`:: Array of ConstantDrop objects
334
+ `variables`:: Array of VariableDrop objects
335
+ `statements`:: Array of StatementDrop objects
336
+ `where_rules`:: Array of WhereRuleDrop objects
337
+ `informal_propositions`:: Array of RemarkItemDrop objects
338
+
339
+ ==== TypeDrop
340
+
341
+ Represents EXPRESS type definitions. Includes identifier functionality.
342
+
343
+ Attributes:
344
+
345
+ `id`:: Type name
346
+ `remarks`:: Array of remarks
347
+ `remark_items`:: Array of RemarkItemDrop objects
348
+ `source`:: Source code representation
349
+ `underlying_type`:: DataTypeDrop representing base type
350
+ `where_rules`:: Array of WhereRuleDrop objects
351
+ `informal_propositions`:: Array of RemarkItemDrop objects
352
+
353
+ ==== UniqueRuleDrop
354
+
355
+ Represents UNIQUE rules in entities. Includes identifier functionality.
356
+
357
+ Attributes:
358
+
359
+ `id`:: Rule name
360
+ `remarks`:: Array of remarks
361
+ `remark_items`:: Array of RemarkItemDrop objects
362
+ `source`:: Source code representation
363
+ `attributes`:: Array of references to attributes
364
+
365
+ ==== VariableDrop
366
+
367
+ Represents local variables. Includes identifier functionality.
368
+
369
+ Attributes:
370
+
371
+ `id`:: Variable name
372
+ `remarks`:: Array of remarks
373
+ `remark_items`:: Array of RemarkItemDrop objects
374
+ `source`:: Source code representation
375
+ `type`:: DataTypeDrop representing variable type
376
+ `expression`:: ExpressionDrop representing initial value
377
+
378
+ ==== WhereRuleDrop
379
+
380
+ Represents WHERE rules. Includes identifier functionality.
381
+
382
+ Attributes:
383
+
384
+ `id`:: Rule name
385
+ `remarks`:: Array of remarks
386
+ `remark_items`:: Array of RemarkItemDrop objects
387
+ `source`:: Source code representation
388
+ `expression`:: ExpressionDrop representing rule condition
389
+
390
+ === Data type drops
391
+
392
+ ==== AggregateDrop
393
+
394
+ Base class for aggregate types. Includes identifier functionality.
395
+
396
+ Attributes:
397
+
398
+ `id`:: Type name
399
+ `remarks`:: Array of remarks
400
+ `remark_items`:: Array of RemarkItemDrop objects
401
+ `source`:: Source code representation
402
+ `base_type`:: DataTypeDrop representing element type
403
+
404
+ ==== ArrayDrop
405
+
406
+ Represents EXPRESS ARRAY type.
407
+
408
+ Attributes:
409
+
410
+ `bound1`:: Lower bound expression
411
+ `bound2`:: Upper bound expression
412
+ `optional`:: Boolean indicating if array is optional
413
+ `unique`:: Boolean indicating if elements must be unique
414
+ `base_type`:: DataTypeDrop representing element type
415
+
416
+ ==== BagDrop
417
+
418
+ Represents EXPRESS BAG type.
419
+
420
+ Attributes:
421
+
422
+ `bound1`:: Lower bound expression
423
+ `bound2`:: Upper bound expression
424
+ `base_type`:: DataTypeDrop representing element type
425
+
426
+ ==== BinaryDrop
427
+
428
+ Represents EXPRESS BINARY type.
429
+
430
+ Attributes:
431
+
432
+ `width`:: Width specification expression
433
+ `fixed`:: Boolean indicating if width is fixed
434
+
435
+ ==== BooleanDrop
436
+
437
+ Represents EXPRESS BOOLEAN type.
438
+
439
+ ==== EnumerationDrop
440
+
441
+ Represents EXPRESS ENUMERATION type.
442
+
443
+ Attributes:
444
+
445
+ `extensible`:: Boolean indicating if enumeration is extensible
446
+ `based_on`:: Reference to base enumeration
447
+ `items`:: Array of EnumerationItemDrop objects
448
+
449
+ ==== EnumerationItemDrop
450
+
451
+ Represents items in an enumeration. Includes identifier functionality.
452
+
453
+ Attributes:
454
+
455
+ `id`:: Item name
456
+ `remarks`:: Array of remarks
457
+ `remark_items`:: Array of RemarkItemDrop objects
458
+ `source`:: Source code representation
459
+
460
+ ==== GenericDrop
461
+
462
+ Represents EXPRESS GENERIC type. Includes identifier functionality.
463
+
464
+ Attributes:
465
+
466
+ `id`:: Type name
467
+ `remarks`:: Array of remarks
468
+ `remark_items`:: Array of RemarkItemDrop objects
469
+ `source`:: Source code representation
470
+
471
+ ==== GenericEntityDrop
472
+
473
+ Represents EXPRESS GENERIC_ENTITY type. Includes identifier functionality.
474
+
475
+ Attributes:
476
+
477
+ `id`:: Type name
478
+ `remarks`:: Array of remarks
479
+ `remark_items`:: Array of RemarkItemDrop objects
480
+ `source`:: Source code representation
481
+
482
+ ==== IntegerDrop
483
+
484
+ Represents EXPRESS INTEGER type.
485
+
486
+ ==== ListDrop
487
+
488
+ Represents EXPRESS LIST type.
489
+
490
+ Attributes:
491
+
492
+ `bound1`:: Lower bound expression
493
+ `bound2`:: Upper bound expression
494
+ `unique`:: Boolean indicating if elements must be unique
495
+ `base_type`:: DataTypeDrop representing element type
496
+
497
+ ==== LogicalDrop
498
+
499
+ Represents EXPRESS LOGICAL type.
500
+
501
+ ==== RealDrop
502
+
503
+ Represents EXPRESS REAL type.
504
+
505
+ Attributes:
506
+
507
+ `precision`:: Precision specification expression
508
+
509
+ ==== SelectDrop
510
+
511
+ Represents EXPRESS SELECT type.
512
+
513
+ Attributes:
514
+
515
+ `extensible`:: Boolean indicating if select is extensible
516
+ `generic_entity`:: Boolean indicating if select is generic entity
517
+ `based_on`:: Reference to base select
518
+ `items`:: Array of references to select items
519
+
520
+ ==== SetDrop
521
+
522
+ Represents EXPRESS SET type.
523
+
524
+ Attributes:
525
+
526
+ `bound1`:: Lower bound expression
527
+ `bound2`:: Upper bound expression
528
+ `base_type`:: DataTypeDrop representing element type
529
+
530
+ ==== StringDrop
531
+
532
+ Represents EXPRESS STRING type.
533
+
534
+ Attributes:
535
+
536
+ `width`:: Width specification expression
537
+ `fixed`:: Boolean indicating if width is fixed
538
+
539
+ === Expression drops
540
+
541
+ ==== AggregateInitializerDrop
542
+
543
+ Represents aggregate initialization expressions.
544
+
545
+ Attributes:
546
+
547
+ `items`:: Array of AggregateInitializerItemDrop objects
548
+
549
+ ==== AggregateInitializerItemDrop
550
+
551
+ Represents items in an aggregate initializer.
552
+
553
+ Attributes:
554
+
555
+ `expression`:: ExpressionDrop representing item value
556
+ `repetition`:: ExpressionDrop representing repetition count
557
+
558
+ ==== BinaryExpressionDrop
559
+
560
+ Represents binary operations.
561
+
562
+ Attributes:
563
+
564
+ `operator`:: Operator symbol
565
+ `operand1`:: ExpressionDrop for first operand
566
+ `operand2`:: ExpressionDrop for second operand
567
+
568
+ ==== EntityConstructorDrop
569
+
570
+ Represents entity constructor expressions.
571
+
572
+ Attributes:
573
+
574
+ `entity`:: Reference to entity being constructed
575
+ `items`:: Array of entity constructor items
576
+
577
+ ==== FunctionCallDrop
578
+
579
+ Represents function call expressions.
580
+
581
+ Attributes:
582
+
583
+ `function`:: Reference to called function
584
+ `parameters`:: Array of parameter expressions
585
+
586
+ ==== IntervalDrop
587
+
588
+ Represents interval expressions.
589
+
590
+ Attributes:
591
+
592
+ `operator`:: Interval operator
593
+ `operand1`:: Lower bound expression
594
+ `operand2`:: Upper bound expression
595
+
596
+ ==== QueryExpressionDrop
597
+
598
+ Represents QUERY expressions.
599
+
600
+ Attributes:
601
+
602
+ `id`:: Query variable name
603
+ `remarks`:: Array of remarks
604
+ `remark_items`:: Array of RemarkItemDrop objects
605
+ `source`:: Source code representation
606
+ `aggregate_source`:: Expression providing source collection
607
+ `expression`:: Query filter expression
608
+
609
+ ==== UnaryExpressionDrop
610
+
611
+ Represents unary operations.
612
+
613
+ Attributes:
614
+
615
+ `operator`:: Operator symbol
616
+ `operand`:: ExpressionDrop for operand
617
+
618
+ === Literal drops
619
+
620
+ ==== BinaryDrop
621
+
622
+ Represents binary literals.
623
+
624
+ Attributes:
625
+
626
+ `value`:: Binary value
627
+
628
+ ==== IntegerDrop
629
+
630
+ Represents integer literals.
631
+
632
+ Attributes:
633
+
634
+ `value`:: Integer value
635
+
636
+ ==== LogicalDrop
637
+
638
+ Represents logical literals.
639
+
640
+ Attributes:
641
+
642
+ `value`:: Logical value (TRUE, FALSE, UNKNOWN)
643
+
644
+ ==== RealDrop
645
+
646
+ Represents real number literals.
647
+
648
+ Attributes:
649
+
650
+ `value`:: Real number value
651
+
652
+ ==== StringDrop
653
+
654
+ Represents string literals.
655
+
656
+ Attributes:
657
+
658
+ `value`:: String value
659
+ `encoded`:: Boolean indicating if string is encoded
660
+
661
+ === Reference drops
662
+
663
+ ==== AttributeReferenceDrop
664
+
665
+ Represents references to attributes.
666
+
667
+ Attributes:
668
+
669
+ `base`:: Reference to base entity/type
670
+ `attribute`:: Reference to attribute
671
+
672
+ ==== GroupReferenceDrop
673
+
674
+ Represents references to groups.
675
+
676
+ Attributes:
677
+
678
+ `base`:: Reference to base entity/type
679
+ `group`:: Reference to group
680
+
681
+ ==== IndexReferenceDrop
682
+
683
+ Represents array/list index references.
684
+
685
+ Attributes:
686
+
687
+ `base`:: Reference to aggregate
688
+ `index1`:: First index expression
689
+ `index2`:: Second index expression (for ranges)
690
+
691
+ ==== SimpleReferenceDrop
692
+
693
+ Represents simple named references.
694
+
695
+ Attributes:
696
+
697
+ `id`:: Referenced name
698
+
699
+ === Statement drops
700
+
701
+ ==== AliasDrop
702
+
703
+ Represents ALIAS statements. Includes identifier functionality.
704
+
705
+ Attributes:
706
+
707
+ `id`:: Alias name
708
+ `remarks`:: Array of remarks
709
+ `remark_items`:: Array of RemarkItemDrop objects
710
+ `source`:: Source code representation
711
+ `expression`:: Referenced expression
712
+ `statements`:: Array of statements in alias block
713
+
714
+ ==== AssignmentDrop
715
+
716
+ Represents assignment statements.
717
+
718
+ Attributes:
719
+
720
+ `expression1`:: Target expression
721
+ `expression2`:: Value expression
722
+
723
+ ==== CaseActionDrop
724
+
725
+ Represents CASE action clauses.
726
+
727
+ Attributes:
728
+
729
+ `labels`:: Array of case label expressions
730
+ `statement`:: Statement to execute
731
+
732
+ ==== CaseDrop
733
+
734
+ Represents CASE statements.
735
+
736
+ Attributes:
737
+
738
+ `expression`:: Selector expression
739
+ `actions`:: Array of CaseActionDrop objects
740
+ `otherwise`:: Otherwise statement
741
+
742
+ ==== CompoundDrop
743
+
744
+ Represents compound statements.
745
+
746
+ Attributes:
747
+
748
+ `statements`:: Array of statements
749
+
750
+ ==== EscapeDrop
751
+
752
+ Represents ESCAPE statements.
753
+
754
+ ==== IfDrop
755
+
756
+ Represents IF statements.
757
+
758
+ Attributes:
759
+
760
+ `expression`:: Condition expression
761
+ `statements`:: Array of statements in then branch
762
+ `else_statements`:: Array of statements in else branch
763
+
764
+ ==== NullDrop
765
+
766
+ Represents NULL statements.
767
+
768
+ ==== ProcedureCallDrop
769
+
770
+ Represents procedure call statements.
771
+
772
+ Attributes:
773
+
774
+ `procedure`:: Reference to called procedure
775
+ `parameters`:: Array of parameter expressions
776
+
777
+ ==== RepeatDrop
778
+
779
+ Represents REPEAT statements.
780
+
781
+ Attributes:
782
+
783
+ `expression`:: Loop condition expression
784
+ `statements`:: Array of statements in loop body
785
+
786
+ ==== ReturnDrop
787
+
788
+ Represents RETURN statements.
789
+
790
+ Attributes:
791
+
792
+ `expression`:: Return value expression
793
+
794
+ ==== SkipDrop
795
+
796
+ Represents SKIP statements.
797
+
798
+ === Constant drop
799
+
800
+ Represents EXPRESS CONSTANT declarations at the schema level. Includes identifier functionality through `IdentifierDrop`.
801
+
802
+ Attributes:
803
+
804
+ * [Added by IdentifierDrop]:
805
+
806
+ `id`::: Identifier name (constant name)
807
+ `remarks`::: Array of remarks associated with the constant
808
+ `remark_items`::: Array of RemarkItemDrop objects containing structured remarks
809
+ `source`::: Source code representation
810
+
811
+ * Constant-specific attributes:
812
+
813
+ `type`::: DataTypeDrop representing the constant's type
814
+ `expression`::: ExpressionDrop representing the constant's value
815
+
816
+ Example EXPRESS:
817
+
818
+ [source,express]
819
+ ----
820
+ CONSTANT
821
+ (* Mathematical constant *)
822
+ PI : REAL := 3.14159;
823
+ (* System limits *)
824
+ MAX_ITEMS : INTEGER := 1000;
825
+ (* Default text *)
826
+ DEFAULT_NAME : STRING := 'Untitled';
827
+ END_CONSTANT;
828
+ ----
829
+
830
+ Example usage showing identifier functionality:
831
+
832
+ [source,liquid]
833
+ ----
834
+ Constants:
835
+ {% for const in schema.constants %}
836
+ {{ const.id }}:
837
+ Type: {{ const.type._class }}
838
+ Value: {{ const.expression.value }}
839
+
840
+ Documentation:
841
+ {% for remark in const.remarks %}
842
+ - {{ remark }}
843
+ {% endfor %}
844
+
845
+ Source:
846
+ {{ const.source }}
847
+
848
+ {% if const.remark_items %}
849
+ Structured Documentation:
850
+ {% for item in const.remark_items %}
851
+ - {{ item.id }}: {{ item.remarks | join: " " }}
852
+ {% endfor %}
853
+ {% endif %}
854
+ {% endfor %}
855
+ ----
856
+
857
+ === Query expression drop
858
+
859
+ Represents an EXPRESS QUERY expression. Includes identifier functionality through `IdentifierDrop` since queries can have variable declarations.
860
+
861
+ Attributes:
862
+
863
+ * [Added by IdentifierDrop]:
864
+
865
+ `id`::: Identifier name (query variable name)
866
+ `remarks`::: Array of remarks associated with the query
867
+ `remark_items`::: Array of RemarkItemDrop objects containing structured remarks
868
+ `source`::: Source code representation
869
+
870
+ * Query-specific attributes:
871
+
872
+ `aggregate_source`::: Expression providing the source collection
873
+ `expression`::: Query filter expression
874
+
875
+ Example EXPRESS:
876
+
877
+ [source,express]
878
+ ----
879
+ RULE find_expensive_items FOR (catalog);
880
+ WHERE
881
+ (* Find items above price threshold *)
882
+ has_expensive : QUERY (
883
+ (* Iterator for catalog items *)
884
+ item <* catalog.items |
885
+ (* Check price threshold *)
886
+ item.price > 1000.0
887
+ ) > 0;
888
+ END_RULE;
889
+ ----
890
+
891
+ Example usage showing identifier functionality:
892
+
893
+ [source,liquid]
894
+ ----
895
+ Query Variable: {{ query.id }}
896
+
897
+ Documentation:
898
+ {% for remark in query.remarks %}
899
+ - {{ remark }}
900
+ {% endfor %}
901
+
902
+ Source:
903
+ {{ query.source }}
904
+
905
+ {% if query.remark_items %}
906
+ Structured Documentation:
907
+ {% for item in query.remark_items %}
908
+ - {{ item.id }}: {{ item.remarks | join: " " }}
909
+ {% endfor %}
910
+ {% endif %}
911
+
912
+ Source Collection: {{ query.aggregate_source }}
913
+ Filter: {{ query.expression }}
914
+ ----
915
+
916
+ === Generic drop
917
+
918
+ Represents an EXPRESS GENERIC type. Includes identifier functionality through `IdentifierDrop`.
919
+
920
+ Attributes:
921
+
922
+ * [Added by IdentifierDrop]:
923
+
924
+ `id`::: Identifier name (generic type name)
925
+ `remarks`::: Array of remarks associated with the generic type
926
+ `remark_items`::: Array of RemarkItemDrop objects containing structured remarks
927
+ `source`::: Source code representation
928
+
929
+ Example EXPRESS:
930
+
931
+ [source,express]
932
+ ----
933
+ TYPE list_type = LIST OF GENERIC;
934
+ (* Generic list type *)
935
+ (* Author: Jane Smith *)
936
+ END_TYPE;
937
+ ----
938
+
939
+ Example usage showing identifier functionality:
940
+
941
+ [source,liquid]
942
+ ----
943
+ Generic Type: {{ type.id }}
944
+
945
+ Documentation:
946
+ {% for remark in type.remarks %}
947
+ - {{ remark }}
948
+ {% endfor %}
949
+
950
+ Source:
951
+ {{ type.source }}
952
+
953
+ {% if type.remark_items %}
954
+ Structured Documentation:
955
+ {% for item in type.remark_items %}
956
+ - {{ item.id }}: {{ item.remarks | join: " " }}
957
+ {% endfor %}
958
+ {% endif %}
959
+ ----
960
+
961
+ === Generic entity drop
962
+
963
+ Represents an EXPRESS GENERIC_ENTITY type. Includes identifier functionality through `IdentifierDrop`.
964
+
965
+ Attributes:
966
+
967
+ * [Added by IdentifierDrop]:
968
+
969
+ `id`::: Identifier name (generic entity name)
970
+ `remarks`::: Array of remarks associated with the generic entity
971
+ `remark_items`::: Array of RemarkItemDrop objects containing structured remarks
972
+ `source`::: Source code representation
973
+
974
+ Example EXPRESS:
975
+
976
+ [source,express]
977
+ ----
978
+ TYPE container = SET OF GENERIC_ENTITY;
979
+ (* Generic entity container *)
980
+ (* Supports any entity type *)
981
+ END_TYPE;
982
+ ----
983
+
984
+ Example usage showing identifier functionality:
985
+
986
+ [source,liquid]
987
+ ----
988
+ Generic Entity: {{ type.id }}
989
+
990
+ Documentation:
991
+ {% for remark in type.remarks %}
992
+ - {{ remark }}
993
+ {% endfor %}
994
+
995
+ Source:
996
+ {{ type.source }}
997
+
998
+ {% if type.remark_items %}
999
+ Structured Documentation:
1000
+ {% for item in type.remark_items %}
1001
+ - {{ item.id }}: {{ item.remarks | join: " " }}
1002
+ {% endfor %}
1003
+ {% endif %}
1004
+ {% endfor %}
1005
+ ----
1006
+
1007
+ === Enumeration item drop
1008
+
1009
+ Represents items in an EXPRESS ENUMERATION type. Includes identifier functionality through `IdentifierDrop`.
1010
+
1011
+ Attributes:
1012
+
1013
+ * [Added by IdentifierDrop]:
1014
+
1015
+ `id`::: Identifier name (enumeration value name)
1016
+ `remarks`::: Array of remarks associated with the enumeration item
1017
+ `remark_items`::: Array of RemarkItemDrop objects containing structured remarks
1018
+ `source`::: Source code representation
1019
+
1020
+ Example EXPRESS:
1021
+
1022
+ [source,express]
1023
+ ----
1024
+ TYPE color = ENUMERATION OF
1025
+ (* Basic colors *)
1026
+ red, (* Primary color *)
1027
+ green, (* Primary color *)
1028
+ blue, (* Primary color *)
1029
+ (* Extended colors *)
1030
+ yellow, (* Secondary color *)
1031
+ purple (* Secondary color *)
1032
+ );
1033
+ END_TYPE;
1034
+ ----
1035
+
1036
+ Example usage showing identifier functionality:
1037
+
1038
+ [source,liquid]
1039
+ ----
1040
+ {% for item in type.underlying_type.items %}
1041
+ Value: {{ item.id }}
1042
+
1043
+ Documentation:
1044
+ {% for remark in item.remarks %}
1045
+ - {{ remark }}
1046
+ {% endfor %}
1047
+
1048
+ Source:
1049
+ {{ item.source }}
1050
+
1051
+ {% if item.remark_items %}
1052
+ Structured Documentation:
1053
+ {% for ritem in item.remark_items %}
1054
+ - {{ ritem.id }}: {{ ritem.remarks | join: " " }}
1055
+ {% endfor %}
1056
+ {% endif %}
1057
+ {% endfor %}
1058
+ ----
1059
+
1060
+ === Aggregate drop
1061
+
1062
+ Represents an EXPRESS aggregate type definition. Includes identifier functionality through `IdentifierDrop`.
1063
+
1064
+ Attributes:
1065
+
1066
+ * [Added by IdentifierDrop]:
1067
+
1068
+ `id`::: Identifier name (aggregate type name)
1069
+ `remarks`::: Array of remarks associated with the aggregate type
1070
+ `remark_items`::: Array of RemarkItemDrop objects containing structured remarks
1071
+ `source`::: Source code representation
1072
+ * Aggregate-specific attributes:
1073
+
1074
+ `base_type`::: DataTypeDrop representing the element type
1075
+
1076
+ Example EXPRESS:
1077
+
1078
+ [source,express]
1079
+ ----
1080
+ TYPE point_list = LIST OF point;
1081
+ (* List of geometric points *)
1082
+ (* Used for polylines *)
1083
+ END_TYPE;
1084
+
1085
+ TYPE color_set = SET OF color;
1086
+ (* Set of unique colors *)
1087
+ (* For color palettes *)
1088
+ END_TYPE;
1089
+ ----
1090
+
1091
+ Example usage showing identifier functionality:
1092
+
1093
+ [source,liquid]
1094
+ ----
1095
+ Aggregate Type: {{ type.id }}
1096
+ Base Type: {{ type.base_type._class }}
1097
+
1098
+ Documentation:
1099
+ {% for remark in type.remarks %}
1100
+ - {{ remark }}
1101
+ {% endfor %}
1102
+
1103
+ Source:
1104
+ {{ type.source }}
1105
+
1106
+ {% if type.remark_items %}
1107
+ Structured Documentation:
1108
+ {% for item in type.remark_items %}
1109
+ - {{ item.id }}: {{ item.remarks | join: " " }}
1110
+ {% endfor %}
1111
+ {% endif %}
1112
+ ----
1113
+
1114
+ === Alias statement drop
1115
+
1116
+ Represents an EXPRESS ALIAS statement. Includes identifier functionality through `IdentifierDrop`.
1117
+
1118
+ Attributes:
1119
+
1120
+ * [Added by IdentifierDrop]:
1121
+
1122
+ `id`::: Identifier name (alias name)
1123
+ `remarks`::: Array of remarks associated with the alias
1124
+ `remark_items`::: Array of RemarkItemDrop objects containing structured remarks
1125
+ `source`::: Source code representation
1126
+ * Alias-specific attributes:
1127
+
1128
+ `expression`::: The referenced expression
1129
+ `statements`::: Array of statements in the ALIAS block
1130
+
1131
+ Example EXPRESS:
1132
+
1133
+ [source,express]
1134
+ ----
1135
+ FUNCTION process_point(p : point) : REAL;
1136
+ (* Create alias for readability *)
1137
+ ALIAS coord := p.coordinates;
1138
+ (* Compute using aliased value *)
1139
+ result := coord.x * coord.y;
1140
+ END_ALIAS;
1141
+ RETURN result;
1142
+ END_FUNCTION;
1143
+ ----
1144
+
1145
+ Example usage showing identifier functionality:
1146
+
1147
+ [source,liquid]
1148
+ ----
1149
+ {% for statement in function.statements %}
1150
+ {% if statement._class contains "Alias" %}
1151
+ Alias: {{ statement.id }}
1152
+
1153
+ Documentation:
1154
+ {% for remark in statement.remarks %}
1155
+ - {{ remark }}
1156
+ {% endfor %}
1157
+
1158
+ Source:
1159
+ {{ statement.source }}
1160
+
1161
+ {% if statement.remark_items %}
1162
+ Structured Documentation:
1163
+ {% for item in statement.remark_items %}
1164
+ - {{ item.id }}: {{ item.remarks | join: " " }}
1165
+ {% endfor %}
1166
+ {% endif %}
1167
+
1168
+ Expression: {{ statement.expression }}
1169
+ {% endif %}
1170
+ {% endfor %}
1171
+ ----
1172
+
1173
+ === Variable drop
1174
+
1175
+ Represents EXPRESS variable declarations in functions and procedures. Includes identifier functionality through `IdentifierDrop`.
1176
+
1177
+ Attributes:
1178
+
1179
+ * [Added by IdentifierDrop]:
1180
+
1181
+ `id`::: Identifier name (variable name)
1182
+ `remarks`::: Array of remarks associated with the variable
1183
+ `remark_items`::: Array of RemarkItemDrop objects containing structured remarks
1184
+ `source`::: Source code representation
1185
+ * Variable-specific attributes:
1186
+
1187
+ `type`::: DataTypeDrop representing the variable's type
1188
+ `expression`::: ExpressionDrop representing the optional initial value
1189
+
1190
+ Example EXPRESS:
1191
+
1192
+ [source,express]
1193
+ ----
1194
+ FUNCTION calculate_area(width, height: REAL) : REAL;
1195
+ LOCAL
1196
+ (* Temporary result storage *)
1197
+ result : REAL := 0.0;
1198
+ (* Status flag *)
1199
+ valid : BOOLEAN := TRUE;
1200
+ END_LOCAL;
1201
+
1202
+ result := width * height;
1203
+ RETURN result;
1204
+ END_FUNCTION;
1205
+ ----
1206
+
1207
+ Example usage showing identifier functionality:
1208
+
1209
+ [source,liquid]
1210
+ ----
1211
+ Local Variables:
1212
+ {% for var in function.variables %}
1213
+ {{ var.id }}:
1214
+ Type: {{ var.type._class }}
1215
+ {% if var.expression %}
1216
+ Initial Value: {{ var.expression }}
1217
+ {% endif %}
1218
+
1219
+ Documentation:
1220
+ {% for remark in var.remarks %}
1221
+ - {{ remark }}
1222
+ {% endfor %}
1223
+
1224
+ Source:
1225
+ {{ var.source }}
1226
+
1227
+ {% if var.remark_items %}
1228
+ Structured Documentation:
1229
+ {% for item in var.remark_items %}
1230
+ - {{ item.id }}: {{ item.remarks | join: " " }}
1231
+ {% endfor %}
1232
+ {% endif %}
1233
+ {% endfor %}
1234
+ ----
1235
+
1236
+ === Working with remark items
1237
+
1238
+ Remark items provide a structured way to handle documentation in EXPRESS schemas. Unlike plain remarks, remark items have both an identifier and content, making them suitable for metadata and categorized documentation.
1239
+
1240
+ Example EXPRESS with structured remarks:
1241
+
1242
+ [source,express]
1243
+ ----
1244
+ SCHEMA building_schema;
1245
+ (* @Author: John Smith *)
1246
+ (* @Version: 1.0 *)
1247
+ (* @Date: 2024-01-15 *)
1248
+ (* @Description: Building information model *)
1249
+
1250
+ TYPE length_measure = REAL;
1251
+ (* @Unit: meters *)
1252
+ (* @Precision: 0.001 *)
1253
+ END_TYPE;
1254
+
1255
+ ENTITY wall;
1256
+ (* @Property: structural *)
1257
+ (* @Material: concrete *)
1258
+ height : length_measure;
1259
+ width : length_measure;
1260
+ END_ENTITY;
1261
+ END_SCHEMA;
1262
+ ----
1263
+
1264
+ Example template for handling remark items:
1265
+
1266
+ [source,liquid]
1267
+ ----
1268
+ {%- comment %}Group remarks by category{% endcomment %}
1269
+ {% assign metadata = [] %}
1270
+ {% assign technical = [] %}
1271
+ {% assign other = [] %}
1272
+
1273
+ {% for ritem in item.remark_items %}
1274
+ {% case ritem.id %}
1275
+ {% when 'Author', 'Version', 'Date' %}
1276
+ {% assign metadata = metadata | push: ritem %}
1277
+ {% when 'Unit', 'Precision', 'Property', 'Material' %}
1278
+ {% assign technical = technical | push: ritem %}
1279
+ {% else %}
1280
+ {% assign other = other | push: ritem %}
1281
+ {% endcase %}
1282
+ {% endfor %}
1283
+
1284
+ {% if metadata.size > 0 %}
1285
+ Metadata:
1286
+ {% for ritem in metadata %}
1287
+ - {{ ritem.id }}: {{ ritem.remarks | join: " " }}
1288
+ {% endfor %}
1289
+ {% endif %}
1290
+
1291
+ {% if technical.size > 0 %}
1292
+ Technical Details:
1293
+ {% for ritem in technical %}
1294
+ - {{ ritem.id }}: {{ ritem.remarks | join: " " }}
1295
+ {% endfor %}
1296
+ {% endif %}
1297
+
1298
+ {% if other.size > 0 %}
1299
+ Additional Information:
1300
+ {% for ritem in other %}
1301
+ - {{ ritem.id }}: {{ ritem.remarks | join: " " }}
1302
+ {% endfor %}
1303
+ {% endif %}
1304
+ ----
1305
+
1306
+ Using the template:
1307
+
1308
+ [source,liquid]
1309
+ ----
1310
+ Schema Documentation:
1311
+ {{ process_remark_items schema }}
1312
+
1313
+ Types:
1314
+ {% for type in schema.types %}
1315
+ {{ type.id }}:
1316
+ {{ process_remark_items type }}
1317
+ {% endfor %}
1318
+
1319
+ Entities:
1320
+ {% for entity in schema.entities %}
1321
+ {{ entity.id }}:
1322
+ {{ process_remark_items entity }}
1323
+
1324
+ Attributes:
1325
+ {% for attr in entity.attributes %}
1326
+ {{ attr.id }}:
1327
+ {{ process_remark_items attr }}
1328
+ {% endfor %}
1329
+ {% endfor %}
1330
+ ----
1331
+
1332
+ Example output:
1333
+
1334
+ [source,text]
1335
+ ----
1336
+ Schema Documentation:
1337
+ Metadata:
1338
+ - Author: John Smith
1339
+ - Version: 1.0
1340
+ - Date: 2024-01-15
1341
+
1342
+ Additional Information:
1343
+ - Description: Building information model
1344
+
1345
+ Types:
1346
+ length_measure:
1347
+ Technical Details:
1348
+ - Unit: meters
1349
+ - Precision: 0.001
1350
+
1351
+ Entities:
1352
+ wall:
1353
+ Technical Details:
1354
+ - Property: structural
1355
+ - Material: concrete
1356
+ ----
1357
+
1358
+ This structured approach makes it easier to:
1359
+ - Generate consistent documentation
1360
+ - Filter and categorize documentation elements
1361
+ - Support multiple documentation formats
1362
+ - Maintain metadata separate from general documentation
1363
+ - Generate different views of the same documentation
1364
+
1365
+ === Common remark item patterns
1366
+
1367
+ Here are some common patterns for working with remark items in templates:
1368
+
1369
+ ==== Filtering by category
1370
+
1371
+ [source,liquid]
1372
+ ----
1373
+ {% assign filtered = [] %}
1374
+ {% for ritem in item.remark_items %}
1375
+ {% if ritem.id == category %}
1376
+ {% assign filtered = filtered | push: ritem %}
1377
+ {% endif %}
1378
+ {% endfor %}
1379
+ {{ filtered | map: "remarks" | join: " " }}
1380
+
1381
+ {%- comment %}Usage examples:{% endcomment %}
1382
+ Author: {{ get_remarks_by_category schema "Author" }}
1383
+ Version: {{ get_remarks_by_category schema "Version" }}
1384
+ ----
1385
+
1386
+ ==== Creating documentation tables
1387
+
1388
+ [source,liquid]
1389
+ ----
1390
+ |===
1391
+ |Category |Value
1392
+
1393
+ {% for ritem in item.remark_items %}
1394
+ |{{ ritem.id }}
1395
+ |{{ ritem.remarks | join: " " }}
1396
+ {% endfor %}
1397
+ |===
1398
+ ----
1399
+
1400
+ ==== Inheritance-aware documentation
1401
+
1402
+ [source,liquid]
1403
+ ----
1404
+ {%- comment %}Get direct remarks{% endcomment %}
1405
+ {% assign all_remarks = entity.remark_items %}
1406
+
1407
+ {%- comment %}Get inherited remarks{% endcomment %}
1408
+ {% for super in entity.subtype_of %}
1409
+ {% for ritem in super.remark_items %}
1410
+ {% assign all_remarks = all_remarks | push: ritem %}
1411
+ {% endfor %}
1412
+ {% endfor %}
1413
+
1414
+ {%- comment %}Remove duplicates by ID{% endcomment %}
1415
+ {% assign unique_remarks = [] %}
1416
+ {% for ritem in all_remarks %}
1417
+ {% unless unique_remarks | map: "id" | contains: ritem.id %}
1418
+ {% assign unique_remarks = unique_remarks | push: ritem %}
1419
+ {% endunless %}
1420
+ {% endfor %}
1421
+
1422
+ {% for ritem in unique_remarks %}
1423
+ - {{ ritem.id }}: {{ ritem.remarks | join: " " }}
1424
+ {% endfor %}
1425
+ ----
1426
+
1427
+ These patterns help maintain consistency and structure when working with documentation in EXPRESS schemas.
1428
+
1429
+ == Drop inheritance hierarchy
1430
+
1431
+ Here's how the drops are organized hierarchically:
1432
+
1433
+ * ModelElementDrop
1434
+ ** DeclarationDrop
1435
+ *** EntityDrop
1436
+ *** TypeDrop
1437
+ *** FunctionDrop
1438
+ *** ProcedureDrop
1439
+ *** RuleDrop
1440
+ *** WhereRuleDrop
1441
+ *** UniqueRuleDrop
1442
+ *** ConstantDrop
1443
+ *** VariableDrop
1444
+ *** ParameterDrop
1445
+ *** AttributeDrop
1446
+ ** ExpressionDrop
1447
+ *** BinaryExpressionDrop
1448
+ *** UnaryExpressionDrop
1449
+ *** QueryExpressionDrop
1450
+ *** FunctionCallDrop
1451
+ *** EntityConstructorDrop
1452
+ *** AggregateInitializerDrop
1453
+ *** IntervalDrop
1454
+ ** DataTypeDrop
1455
+ *** AggregateDrop
1456
+ **** ArrayDrop
1457
+ **** BagDrop
1458
+ **** ListDrop
1459
+ **** SetDrop
1460
+ *** BinaryDrop
1461
+ *** BooleanDrop
1462
+ *** EnumerationDrop
1463
+ *** GenericDrop
1464
+ *** GenericEntityDrop
1465
+ *** IntegerDrop
1466
+ *** LogicalDrop
1467
+ *** RealDrop
1468
+ *** SelectDrop
1469
+ *** StringDrop
1470
+ ** ReferenceDrop
1471
+ *** SimpleReferenceDrop
1472
+ *** AttributeReferenceDrop
1473
+ *** GroupReferenceDrop
1474
+ *** IndexReferenceDrop
1475
+ ** StatementDrop
1476
+ *** AliasDrop
1477
+ *** AssignmentDrop
1478
+ *** CaseDrop
1479
+ *** CompoundDrop
1480
+ *** EscapeDrop
1481
+ *** IfDrop
1482
+ *** NullDrop
1483
+ *** ProcedureCallDrop
1484
+ *** RepeatDrop
1485
+ *** ReturnDrop
1486
+ *** SkipDrop
1487
+ ** LiteralDrop
1488
+ *** BinaryDrop
1489
+ *** IntegerDrop
1490
+ *** LogicalDrop
1491
+ *** RealDrop
1492
+ *** StringDrop
1493
+
1494
+ === Common inheritance patterns
1495
+
1496
+ When working with drops that share a common base class, you can use patterns like:
1497
+
1498
+ [source,liquid]
1499
+ ----
1500
+ {% for item in items %}
1501
+ {% case item._class %}
1502
+ {% when 'EntityDrop' %}
1503
+ // Process entity
1504
+ {% when 'TypeDrop' %}
1505
+ // Process type
1506
+ {% when 'FunctionDrop' %}
1507
+ // Process function
1508
+ {% else %}
1509
+ // Handle other declarations
1510
+ {% endcase %}
1511
+ {% endfor %}
1512
+
1513
+ {% for expr in exprs %}
1514
+ {% case expr._class %}
1515
+ {% when 'BinaryExpressionDrop' %}
1516
+ {{ expr.operand1 }} {{ expr.operator }} {{ expr.operand2 }}
1517
+ {% when 'UnaryExpressionDrop' %}
1518
+ {{ expr.operator }}{{ expr.operand }}
1519
+ {% when 'QueryExpressionDrop' %}
1520
+ QUERY({{ expr.id }} <* {{ expr.aggregate_source }} | {{ expr.expression }})
1521
+ {% else %}
1522
+ {{ expr }}
1523
+ {% endcase %}
1524
+ {% endfor %}
1525
+ ----
1526
+
1527
+ === Common base class attributes
1528
+
1529
+ When working with drops, remember these common attributes available through inheritance:
1530
+
1531
+ 1. From ModelElementDrop:
1532
+
1533
+ `_class`:: Type of drop
1534
+ `file`:: Source file (if applicable)
1535
+ `source`:: Original source code
1536
+
1537
+ 2. From DeclarationDrop:
1538
+
1539
+ * All ModelElementDrop attributes
1540
+ * Additional structure for named declarations
1541
+
1542
+ 3. When IdentifierDrop is included:
1543
+
1544
+ `id`:: Identifier name
1545
+ `remarks`:: Documentation comments
1546
+ `remark_items`:: Structured documentation
1547
+ `source`:: Source representation