tests: add base_attr_annot.nit
[nit.git] / src / parser / parser_nodes.nit
1 # This file is part of NIT ( http://www.nitlanguage.org ).
2 #
3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at
6 #
7 # http://www.apache.org/licenses/LICENSE-2.0
8 #
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 # See the License for the specific language governing permissions and
13 # limitations under the License.
14
15 # AST nodes of the Nit language
16 # Was previously based on parser_abs.nit.
17 module parser_nodes
18
19 import location
20 import ordered_tree
21
22 # Root of the AST class-hierarchy
23 abstract class ANode
24 # Location is set during AST building. Once built, location cannon be null.
25 # However, manual instantiated nodes may need more care.
26 var location: Location is writable, noinit
27
28 # The location of the important part of the node (identifier or whatever)
29 fun hot_location: Location do return location
30
31 # Display a message for the colored location of the node
32 fun debug(message: String)
33 do
34 sys.stderr.write "{hot_location} {self.class_name}: {message}\n{hot_location.colored_line("0;32")}\n"
35 end
36
37 # Write the subtree on stdout.
38 # See `ASTDump`
39 fun dump_tree
40 do
41 var d = new ASTDump
42 d.enter_visit(self)
43 d.write_to(sys.stdout)
44 end
45
46 # Parent of the node in the AST
47 var parent: nullable ANode = null
48
49 # The topmost ancestor of the element
50 # This just apply `parent` until the first one
51 fun root: ANode
52 do
53 var res = self
54 loop
55 var p = res.parent
56 if p == null then return res
57 res = p
58 end
59 end
60
61 # The most specific common parent between `self` and `other`
62 # Return null if the two node are unrelated (distinct root)
63 fun common_parent(other: ANode): nullable ANode
64 do
65 # First, get the same depth
66 var s: nullable ANode = self
67 var o: nullable ANode = other
68 var d = s.depth - o.depth
69 while d > 0 do
70 s = s.parent
71 d -= 1
72 end
73 while d < 0 do
74 o = o.parent
75 d += 1
76 end
77 assert o.depth == s.depth
78 # Second, go up until same in found
79 while s != o do
80 s = s.parent
81 o = o.parent
82 end
83 return s
84 end
85
86 # Number of nodes between `self` and the `root` of the AST
87 # ENSURE `self == self.root implies result == 0 `
88 # ENSURE `self != self.root implies result == self.parent.depth + 1`
89 fun depth: Int
90 do
91 var n = self
92 var res = 0
93 loop
94 var p = n.parent
95 if p == null then return res
96 n = p
97 res += 1
98 end
99 end
100
101 # Replace a child with an other node in the AST
102 private fun replace_child(old_child: ANode, new_child: nullable ANode) is abstract
103
104 # Detach a node from its parent
105 # Aborts if the node is not detachable. use `replace_with` instead
106 # REQUIRE: parent != null
107 # REQUIRE: is_detachable
108 # ENDURE: parent == null
109 fun detach
110 do
111 assert parent != null
112 parent.replace_child(self, null)
113 parent = null
114 end
115
116 # Replace itself with an other node in the AST
117 # REQUIRE: parent != null
118 # ENSURE: node.parent == old(parent)
119 # ENSURE: parent == null
120 fun replace_with(node: ANode)
121 do
122 assert parent != null
123 parent.replace_child(self, node)
124 parent = null
125 end
126
127 # Visit all nodes in order.
128 # Thus, call `v.enter_visit(e)` for each child `e`
129 fun visit_all(v: Visitor) is abstract
130
131 # Do a deep search and return an array of tokens that match a given text
132 fun collect_tokens_by_text(text: String): Array[Token]
133 do
134 var v = new CollectTokensByTextVisitor(text)
135 v.enter_visit(self)
136 return v.result
137 end
138
139 # Do a deep search and return an array of node that are annotated
140 # The attached node can be retrieved by two invocations of parent
141 fun collect_annotations_by_name(name: String): Array[AAnnotation]
142 do
143 var v = new CollectAnnotationsByNameVisitor(name)
144 v.enter_visit(self)
145 return v.result
146 end
147 end
148
149 private class CollectTokensByTextVisitor
150 super Visitor
151 var text: String
152 var result = new Array[Token]
153 redef fun visit(node)
154 do
155 node.visit_all(self)
156 if node isa Token and node.text == text then result.add(node)
157 end
158 end
159
160 private class CollectAnnotationsByNameVisitor
161 super Visitor
162 var name: String
163 var result = new Array[AAnnotation]
164 redef fun visit(node)
165 do
166 node.visit_all(self)
167 if node isa AAnnotation and node.n_atid.n_id.text == name then result.add(node)
168 end
169 end
170
171 # A helper class to handle (print) Nit AST as an OrderedTree
172 class ASTDump
173 super Visitor
174 super OrderedTree[ANode]
175
176 # Reference to the last parent in the Ordered Tree
177 # Is used to handle the initial node parent and workaround possible inconsistent `ANode::parent`
178 private var last_parent: nullable ANode = null
179
180 redef fun visit(n)
181 do
182 var p = last_parent
183 add(p, n)
184 last_parent = n
185 n.visit_all(self)
186 last_parent = p
187 end
188
189 redef fun display(n)
190 do
191 if n isa Token then
192 return "{n.class_name} \"{n.text.escape_to_c}\" @{n.location}"
193 else
194 return "{n.class_name} @{n.location}"
195 end
196 end
197 end
198
199 # A sequence of nodes
200 # It is a specific class (instead of using a Array) to track the parent/child relation when nodes are added or removed
201 class ANodes[E: ANode]
202 super Sequence[E]
203 private var parent: ANode
204 private var items = new Array[E]
205 redef fun iterator do return items.iterator
206 redef fun length do return items.length
207 redef fun is_empty do return items.is_empty
208 redef fun push(e)
209 do
210 hook_add(e)
211 items.push(e)
212 end
213 redef fun pop
214 do
215 var res = items.pop
216 hook_remove(res)
217 return res
218 end
219 redef fun unshift(e)
220 do
221 hook_add(e)
222 items.unshift(e)
223 end
224 redef fun shift
225 do
226 var res = items.shift
227 hook_remove(res)
228 return res
229 end
230 redef fun has(e)
231 do
232 return items.has(e)
233 end
234 redef fun [](index)
235 do
236 return items[index]
237 end
238 redef fun []=(index, e)
239 do
240 hook_remove(self[index])
241 hook_add(e)
242 items[index]=e
243 end
244 redef fun remove_at(index)
245 do
246 hook_remove(items[index])
247 items.remove_at(index)
248 end
249 private fun hook_add(e: E)
250 do
251 #assert e.parent == null
252 e.parent = parent
253 end
254 private fun hook_remove(e: E)
255 do
256 assert e.parent == parent
257 e.parent = null
258 end
259
260 # Used in parent constructor to fill elements
261 private fun unsafe_add_all(nodes: Collection[Object])
262 do
263 var parent = self.parent
264 for n in nodes do
265 assert n isa E
266 add n
267 n.parent = parent
268 end
269 end
270
271 private fun replace_child(old_child: ANode, new_child: nullable ANode): Bool
272 do
273 var parent = self.parent
274 for i in [0..length[ do
275 if self[i] == old_child then
276 if new_child != null then
277 assert new_child isa E
278 self[i] = new_child
279 new_child.parent = parent
280 else
281 self.remove_at(i)
282 end
283 return true
284 end
285 end
286 return false
287 end
288
289 private fun visit_all(v: Visitor)
290 do
291 for n in self do v.enter_visit(n)
292 end
293 end
294
295 # Ancestor of all tokens
296 # A token is a node that has a `text` but no children.
297 abstract class Token
298 super ANode
299
300 # The raw content on the token
301 fun text: String is abstract
302
303 # The raw content on the token
304 fun text=(text: String) is abstract
305
306 # The previous token in the Lexer.
307 # May have disappeared in the AST
308 var prev_token: nullable Token = null
309
310 # The next token in the Lexer.
311 # May have disappeared in the AST
312 var next_token: nullable Token = null
313
314 # The verbatim blank text between `prev_token` and `self`
315 fun blank_before: String
316 do
317 if prev_token == null then return ""
318 var from = prev_token.location.pend+1
319 var to = location.pstart
320 return location.file.string.substring(from,to-from)
321 end
322
323 redef fun to_s: String do
324 return "'{text}'"
325 end
326
327 redef fun visit_all(v: Visitor) do end
328 redef fun replace_child(old_child: ANode, new_child: nullable ANode) do end
329 end
330
331 redef class SourceFile
332 # The first token parser by the lexer
333 # May have disappeared in the final AST
334 var first_token: nullable Token = null
335
336 # The first token parser by the lexer
337 # May have disappeared in the final AST
338 var last_token: nullable Token = null
339 end
340
341 # Ancestor of all productions
342 # A production is a node without text but that usually has children.
343 abstract class Prod
344 super ANode
345
346 # All the annotations attached directly to the node
347 var n_annotations: nullable AAnnotations = null is writable
348
349 # Return all its annotations of a given name in the order of their declaration
350 # Retun an empty array if no such an annotation.
351 fun get_annotations(name: String): Array[AAnnotation]
352 do
353 var res = new Array[AAnnotation]
354 var nas = n_annotations
355 if nas != null then for na in nas.n_items do
356 if na.name != name then continue
357 res.add(na)
358 end
359 if self isa AClassdef then for na in n_propdefs do
360 if na isa AAnnotPropdef then
361 if na.name != name then continue
362 res.add na
363 end
364 end
365
366 return res
367 end
368
369 redef fun replace_with(n: ANode)
370 do
371 super
372 assert n isa Prod
373 if not isset n._location and isset _location then n._location = _location
374 end
375 end
376
377 # Abstract standard visitor on the AST
378 abstract class Visitor
379 # What the visitor do when a node is visited
380 # Concrete visitors should implement this method.
381 # @toimplement
382 protected fun visit(e: ANode) is abstract
383
384 # Ask the visitor to visit a given node.
385 # Usually automatically called by visit_all* methods.
386 # This method should not be redefined
387 fun enter_visit(e: nullable ANode)
388 do
389 if e == null then return
390 var old = _current_node
391 _current_node = e
392 visit(e)
393 _current_node = old
394 end
395
396 # The current visited node
397 var current_node: nullable ANode = null is writable
398 end
399
400 # Token of end of line (basically `\n`)
401 class TEol
402 super Token
403 redef fun to_s
404 do
405 return "end of line"
406 end
407 end
408
409 # Token of a line of comments
410 # Starts with the `#` and contains the final end-of-line (if any)
411 class TComment
412 super Token
413 end
414
415 # A token associated with a keyword
416 abstract class TokenKeyword
417 super Token
418 redef fun to_s
419 do
420 return "keyword '{text}'"
421 end
422 end
423
424 # The deprecated keyword `package`.
425 class TKwpackage
426 super TokenKeyword
427 end
428
429 # The keyword `module`
430 class TKwmodule
431 super TokenKeyword
432 end
433
434 # The keyword `import`
435 class TKwimport
436 super TokenKeyword
437 end
438
439 # The keyword `class`
440 class TKwclass
441 super TokenKeyword
442 end
443
444 # The keyword `abstract`
445 class TKwabstract
446 super TokenKeyword
447 end
448
449 # The keyword `interface`
450 class TKwinterface
451 super TokenKeyword
452 end
453
454 # The keywords `enum` ane `universal`
455 class TKwenum
456 super TokenKeyword
457 end
458
459 # The keyword `end`
460 class TKwend
461 super TokenKeyword
462 end
463
464 # The keyword `fun`
465 class TKwmeth
466 super TokenKeyword
467 end
468
469 # The keyword `type`
470 class TKwtype
471 super TokenKeyword
472 end
473
474 # The keyword `init`
475 class TKwinit
476 super TokenKeyword
477 end
478
479 # The keyword `redef`
480 class TKwredef
481 super TokenKeyword
482 end
483
484 # The keyword `is`
485 class TKwis
486 super TokenKeyword
487 end
488
489 # The keyword `do`
490 class TKwdo
491 super TokenKeyword
492 end
493
494 # The keyword `var`
495 class TKwvar
496 super TokenKeyword
497 end
498
499 # The keyword `extern`
500 class TKwextern
501 super TokenKeyword
502 end
503
504 # The keyword `public`
505 class TKwpublic
506 super TokenKeyword
507 end
508
509 # The keyword `protected`
510 class TKwprotected
511 super TokenKeyword
512 end
513
514 # The keyword `private`
515 class TKwprivate
516 super TokenKeyword
517 end
518
519 # The keyword `intrude`
520 class TKwintrude
521 super TokenKeyword
522 end
523
524 # The keyword `if`
525 class TKwif
526 super TokenKeyword
527 end
528
529 # The keyword `then`
530 class TKwthen
531 super TokenKeyword
532 end
533
534 # The keyword `else`
535 class TKwelse
536 super TokenKeyword
537 end
538
539 # The keyword `while`
540 class TKwwhile
541 super TokenKeyword
542 end
543
544 # The keyword `loop`
545 class TKwloop
546 super TokenKeyword
547 end
548
549 # The keyword `for`
550 class TKwfor
551 super TokenKeyword
552 end
553
554 # The keyword `in`
555 class TKwin
556 super TokenKeyword
557 end
558
559 # The keyword `and`
560 class TKwand
561 super TokenKeyword
562 end
563
564 # The keyword `or`
565 class TKwor
566 super TokenKeyword
567 end
568
569 # The keyword `implies`
570 class TKwimplies
571 super TokenKeyword
572 end
573
574 # The keyword `not`
575 class TKwnot
576 super TokenKeyword
577 end
578
579 # The keyword `return`
580 class TKwreturn
581 super TokenKeyword
582 end
583
584 # The keyword `continue`
585 class TKwcontinue
586 super TokenKeyword
587 end
588
589 # The keyword `break`
590 class TKwbreak
591 super TokenKeyword
592 end
593
594 # The keyword `abort`
595 class TKwabort
596 super TokenKeyword
597 end
598
599 # The keyword `assert`
600 class TKwassert
601 super TokenKeyword
602 end
603
604 # The keyword `new`
605 class TKwnew
606 super TokenKeyword
607 end
608
609 # The keyword `isa`
610 class TKwisa
611 super TokenKeyword
612 end
613
614 # The keyword `once`
615 class TKwonce
616 super TokenKeyword
617 end
618
619 # The keyword `super`
620 class TKwsuper
621 super TokenKeyword
622 end
623
624 # The keyword `self`
625 class TKwself
626 super TokenKeyword
627 end
628
629 # The keyword `true`
630 class TKwtrue
631 super TokenKeyword
632 end
633
634 # The keyword `false`
635 class TKwfalse
636 super TokenKeyword
637 end
638
639 # The keyword `null`
640 class TKwnull
641 super TokenKeyword
642 end
643
644 # The keyword `as`
645 class TKwas
646 super TokenKeyword
647 end
648
649 # The keyword `nullable`
650 class TKwnullable
651 super TokenKeyword
652 end
653
654 # The keyword `isset`
655 class TKwisset
656 super TokenKeyword
657 end
658
659 # The keyword `label`
660 class TKwlabel
661 super TokenKeyword
662 end
663
664 # The keyword `with`
665 class TKwwith
666 super TokenKeyword
667 end
668
669 # The special keyword `__DEBUG__`
670 class TKwdebug
671 super Token
672 end
673
674 # The symbol `(`
675 class TOpar
676 super Token
677 end
678
679 # The symbol `)`
680 class TCpar
681 super Token
682 end
683
684 # The symbol `[`
685 class TObra
686 super Token
687 end
688
689 # The symbol `]`
690 class TCbra
691 super Token
692 end
693
694 # The symbol `,`
695 class TComma
696 super Token
697 end
698
699 # The symbol `:`
700 class TColumn
701 super Token
702 end
703
704 # The symbol `::`
705 class TQuad
706 super Token
707 end
708
709 # The symbol `=`
710 class TAssign
711 super Token
712 end
713
714 # A token associated with an operator (and other lookalike symbols)
715 abstract class TokenOperator
716 super Token
717 redef fun to_s
718 do
719 return "operator '{text}'"
720 end
721 end
722
723 # The operator `+=`
724 class TPluseq
725 super TokenOperator
726 end
727
728 # The operator `-=`
729 class TMinuseq
730 super TokenOperator
731 end
732
733 # The operator `*=`
734 class TStareq
735 super TokenOperator
736 end
737
738 # The operator `/=`
739 class TSlasheq
740 super TokenOperator
741 end
742
743 # The operator `%=`
744 class TPercenteq
745 super TokenOperator
746 end
747
748 # The operator `**=`
749 class TStarstareq
750 super TokenOperator
751 end
752
753 # The operator `|=`
754 class TPipeeq
755 super TokenOperator
756 end
757
758 # The operator `^=`
759 class TCareteq
760 super TokenOperator
761 end
762
763 # The operator `&=`
764 class TAmpeq
765 super TokenOperator
766 end
767
768 # The operator `<<=`
769 class TLleq
770 super TokenOperator
771 end
772
773 # The operator `>>=`
774 class TGgeq
775 super TokenOperator
776 end
777
778 # The symbol `...`
779 class TDotdotdot
780 super Token
781 end
782
783 # The symbol `..`
784 class TDotdot
785 super Token
786 end
787
788 # The symbol `.`
789 class TDot
790 super Token
791 end
792
793 # The operator `+`
794 class TPlus
795 super TokenOperator
796 end
797
798 # The operator `-`
799 class TMinus
800 super TokenOperator
801 end
802
803 # The operator `*`
804 class TStar
805 super TokenOperator
806 end
807
808 # The operator `**`
809 class TStarstar
810 super TokenOperator
811 end
812
813 # The operator `/`
814 class TSlash
815 super TokenOperator
816 end
817
818 # The operator `%`
819 class TPercent
820 super TokenOperator
821 end
822
823 # The operator `|`
824 class TPipe
825 super TokenOperator
826 end
827
828 # The operator `^`
829 class TCaret
830 super TokenOperator
831 end
832
833 # The operator `&`
834 class TAmp
835 super TokenOperator
836 end
837
838 # The operator `~`
839 class TTilde
840 super TokenOperator
841 end
842
843 # The operator `==`
844 class TEq
845 super TokenOperator
846 end
847
848 # The operator `!=`
849 class TNe
850 super TokenOperator
851 end
852
853 # The operator `<`
854 class TLt
855 super TokenOperator
856 end
857
858 # The operator `<=`
859 class TLe
860 super TokenOperator
861 end
862
863 # The operator `<<`
864 class TLl
865 super TokenOperator
866 end
867
868 # The operator `>`
869 class TGt
870 super TokenOperator
871 end
872
873 # The operator `>=`
874 class TGe
875 super TokenOperator
876 end
877
878 # The operator `>>`
879 class TGg
880 super TokenOperator
881 end
882
883 # The operator `<=>`
884 class TStarship
885 super TokenOperator
886 end
887
888 # The operator `!`
889 class TBang
890 super TokenOperator
891 end
892
893 # The symbol `@`
894 class TAt
895 super Token
896 end
897
898 # The symbol `;`
899 class TSemi
900 super Token
901 end
902
903 # A class (or formal type) identifier. They start with an uppercase.
904 class TClassid
905 super Token
906 redef fun to_s
907 do
908 do return "type identifier '{text}'"
909 end
910 end
911
912 # A standard identifier (variable, method...). They start with a lowercase.
913 class TId
914 super Token
915 redef fun to_s
916 do
917 do return "identifier '{text}'"
918 end
919 end
920
921 # An attribute identifier. They start with an underscore.
922 class TAttrid
923 super Token
924 redef fun to_s
925 do
926 do return "attribute '{text}'"
927 end
928 end
929
930 # A token of a literal value (string, integer, etc).
931 abstract class TokenLiteral
932 super Token
933 redef fun to_s
934 do
935 do return "literal value '{text}'"
936 end
937 end
938
939 # A literal decimal integer
940 class TNumber
941 super TokenLiteral
942 end
943
944 # A literal hexadecimal integer
945 class THexNumber
946 super TokenLiteral
947 end
948
949 # A literal binary integer
950 class TBinNumber
951 super TokenLiteral
952 end
953
954 # A literal octal integer
955 class TOctNumber
956 super TokenLiteral
957 end
958
959 # A literal decimal byte
960 class TBytenum
961 super TokenLiteral
962 end
963
964 # A literal hexadecimal byte
965 class THexBytenum
966 super TokenLiteral
967 end
968
969 # A literal binary byte
970 class TBinBytenum
971 super TokenLiteral
972 end
973
974 # A literal octal byte
975 class TOctBytenum
976 super TokenLiteral
977 end
978
979 # A literal floating point number
980 class TFloat
981 super TokenLiteral
982 end
983
984 # A literal character
985 class TChar
986 super TokenLiteral
987 end
988
989 # A literal string
990 class TString
991 super TokenLiteral
992 end
993
994 # The starting part of a super string (between `"` and `{`)
995 class TStartString
996 super TokenLiteral
997 end
998
999 # The middle part of a super string (between `}` and `{`)
1000 class TMidString
1001 super TokenLiteral
1002 end
1003
1004 # The final part of a super string (between `}` and `"`)
1005 class TEndString
1006 super TokenLiteral
1007 end
1008
1009 # A malformed string
1010 class TBadString
1011 super Token
1012 redef fun to_s
1013 do
1014 do return "malformed string {text}"
1015 end
1016 end
1017
1018 # A malformed char
1019 class TBadChar
1020 super Token
1021 redef fun to_s
1022 do
1023 do return "malformed character {text}"
1024 end
1025 end
1026
1027 # A extern code block
1028 class TExternCodeSegment
1029 super Token
1030 end
1031
1032 # A end of file
1033 class EOF
1034 super Token
1035 redef fun to_s
1036 do
1037 return "end of file"
1038 end
1039 end
1040
1041 # A mark of an error
1042 class AError
1043 super EOF
1044 end
1045 # A lexical error (unexpected character)
1046 class ALexerError
1047 super AError
1048 end
1049 # A syntactic error (unexpected token)
1050 class AParserError
1051 super AError
1052 end
1053
1054 # The main node of a Nit source-file
1055 class AModule
1056 super Prod
1057
1058 # The declaration part of the module
1059 var n_moduledecl: nullable AModuledecl = null is writable
1060
1061 # List of importation clauses
1062 var n_imports = new ANodes[AImport](self)
1063
1064 # List of extern blocks
1065 var n_extern_code_blocks = new ANodes[AExternCodeBlock](self)
1066
1067 # List of class definition (including top-level methods and the main)
1068 var n_classdefs = new ANodes[AClassdef](self)
1069 end
1070
1071 # Abstract class for definition of entities
1072 abstract class ADefinition
1073 super Prod
1074 # The documentation
1075 var n_doc: nullable ADoc = null is writable
1076
1077 # The `redef` keyword
1078 var n_kwredef: nullable TKwredef = null is writable
1079
1080 # The declared visibility
1081 var n_visibility: nullable AVisibility = null is writable
1082 end
1083
1084 # The declaration of the module with the documentation, name, and annotations
1085 class AModuledecl
1086 super ADefinition
1087
1088 # The `module` keyword
1089 var n_kwmodule: TKwmodule is writable, noinit
1090
1091 # The declared module name
1092 var n_name: AModuleName is writable, noinit
1093 end
1094
1095 # A import clause of a module
1096 abstract class AImport
1097 super Prod
1098
1099 # The declared visibility
1100 var n_visibility: AVisibility is writable, noinit
1101
1102 # The `import` keyword
1103 var n_kwimport: TKwimport is writable, noinit
1104 end
1105
1106 # A standard import clause. eg `import x`
1107 class AStdImport
1108 super AImport
1109 # The imported module name
1110 var n_name: AModuleName is writable, noinit
1111 end
1112
1113 # The special import clause of the kernel module. eg `import end`
1114 class ANoImport
1115 super AImport
1116 # The `end` keyword, that indicate the root module
1117 var n_kwend: TKwend is writable, noinit
1118 end
1119
1120 # A visibility modifier
1121 #
1122 # The public visibility is an empty production (no keyword).
1123 #
1124 # Note: even if some visibilities are only valid on some placse (for instance, no `protected` class or no `intrude` method)
1125 # the parser has no such a restriction, therefore the semantic phases has to check that the visibilities make sense.
1126 abstract class AVisibility
1127 super Prod
1128 end
1129
1130 # An implicit or explicit public visibility modifier
1131 class APublicVisibility
1132 super AVisibility
1133 # The `public` keyword, if any
1134 var n_kwpublic: nullable TKwpublic is writable
1135 end
1136 # An explicit private visibility modifier
1137 class APrivateVisibility
1138 super AVisibility
1139 # The `private` keyword
1140 var n_kwprivate: TKwprivate is writable, noinit
1141 end
1142 # An explicit protected visibility modifier
1143 class AProtectedVisibility
1144 super AVisibility
1145 # The `protected` keyword
1146 var n_kwprotected: TKwprotected is writable, noinit
1147 end
1148 # An explicit intrude visibility modifier
1149 class AIntrudeVisibility
1150 super AVisibility
1151 # The `intrude` keyword
1152 var n_kwintrude: TKwintrude is writable, noinit
1153 end
1154
1155 # A class definition
1156 # While most definition are `AStdClassdef`
1157 # There is tow special case of class definition
1158 abstract class AClassdef
1159 super Prod
1160 # All the declared properties (including the main method)
1161 var n_propdefs = new ANodes[APropdef](self)
1162 end
1163
1164 # A standard class definition with a name, superclasses and properties
1165 class AStdClassdef
1166 super AClassdef
1167 super ADefinition
1168
1169 # The class kind (interface, abstract class, etc.)
1170 var n_classkind: AClasskind is writable, noinit
1171
1172 # The name of the class
1173 var n_id: nullable TClassid = null is writable
1174
1175 # The `[` symbol
1176 var n_obra: nullable TObra = null is writable
1177
1178 # The list of formal parameter types
1179 var n_formaldefs = new ANodes[AFormaldef](self)
1180
1181 # The `]` symbol
1182 var n_cbra: nullable TCbra = null is writable
1183
1184 # The extern block code
1185 var n_extern_code_block: nullable AExternCodeBlock = null is writable
1186
1187 # The `end` keyword
1188 var n_kwend: TKwend is writable, noinit
1189
1190 fun n_superclasses: Array[ASuperPropdef] do
1191 return [for d in n_propdefs do if d isa ASuperPropdef then d]
1192 end
1193
1194 redef fun hot_location do return n_id.location
1195 end
1196
1197 # The implicit class definition of the implicit main method
1198 class ATopClassdef
1199 super AClassdef
1200 end
1201
1202 # The implicit class definition of the top-level methods
1203 class AMainClassdef
1204 super AClassdef
1205 end
1206
1207 # The modifier for the kind of class (abstract, interface, etc.)
1208 abstract class AClasskind
1209 super Prod
1210 end
1211
1212 # A default, or concrete class modifier (just `class`)
1213 class AConcreteClasskind
1214 super AClasskind
1215
1216 # The `class` keyword.
1217 var n_kwclass: TKwclass is writable, noinit
1218 end
1219
1220 # An abstract class modifier (`abstract class`)
1221 class AAbstractClasskind
1222 super AClasskind
1223
1224 # The `abstract` keyword.
1225 var n_kwabstract: TKwabstract is writable, noinit
1226
1227 # The `class` keyword.
1228 var n_kwclass: TKwclass is writable, noinit
1229 end
1230
1231 # An interface class modifier (`interface`)
1232 class AInterfaceClasskind
1233 super AClasskind
1234
1235 # The `interface` keyword.
1236 var n_kwinterface: TKwinterface is writable, noinit
1237 end
1238
1239 # An enum/universal class modifier (`enum class`)
1240 class AEnumClasskind
1241 super AClasskind
1242
1243 # The `enum` keyword.
1244 var n_kwenum: TKwenum is writable, noinit
1245 end
1246
1247 # An extern class modifier (`extern class`)
1248 class AExternClasskind
1249 super AClasskind
1250
1251 # The `extern` keyword.
1252 var n_kwextern: TKwextern is writable, noinit
1253
1254 # The `class` keyword.
1255 var n_kwclass: nullable TKwclass = null is writable
1256 end
1257
1258 # The definition of a formal generic parameter type. eg `X: Y`
1259 class AFormaldef
1260 super Prod
1261
1262 # The name of the parameter type
1263 var n_id: TClassid is writable, noinit
1264
1265 # The bound of the parameter type
1266 var n_type: nullable AType = null is writable
1267 end
1268
1269 # The definition of a property
1270 abstract class APropdef
1271 super ADefinition
1272 end
1273
1274 # A definition of an attribute
1275 # For historical reason, old-syle and new-style attributes use the same `ANode` sub-class
1276 class AAttrPropdef
1277 super APropdef
1278
1279 # The `var` keyword
1280 var n_kwvar: TKwvar is writable, noinit
1281
1282 # The identifier for a new-style attribute
1283 var n_id2: TId is writable, noinit
1284
1285 # The declared type of the attribute
1286 var n_type: nullable AType = null is writable
1287
1288 # The `=` symbol
1289 var n_assign: nullable TAssign = null is writable
1290
1291 # The initial value, if any (set with `=`)
1292 var n_expr: nullable AExpr = null is writable
1293
1294 # The `do` keyword
1295 var n_kwdo: nullable TKwdo = null is writable
1296
1297 # The initial value, if any (set with `do return`)
1298 var n_block: nullable AExpr = null is writable
1299
1300 # The `end` keyword
1301 var n_kwend: nullable TKwend = null is writable
1302
1303 redef fun hot_location
1304 do
1305 return n_id2.location
1306 end
1307 end
1308
1309 # A definition of all kind of method (including constructors)
1310 class AMethPropdef
1311 super APropdef
1312
1313 # The `fun` keyword, if any
1314 var n_kwmeth: nullable TKwmeth = null is writable
1315
1316 # The `init` keyword, if any
1317 var n_kwinit: nullable TKwinit = null is writable
1318
1319 # The `new` keyword, if any
1320 var n_kwnew: nullable TKwnew = null is writable
1321
1322 # The name of the method, if any
1323 var n_methid: nullable AMethid = null is writable
1324
1325 # The signature of the method, if any
1326 var n_signature: nullable ASignature = null is writable
1327
1328 # The `do` keyword
1329 var n_kwdo: nullable TKwdo = null is writable
1330
1331 # The body (in Nit) of the method, if any
1332 var n_block: nullable AExpr = null is writable
1333
1334 # The `end` keyword
1335 var n_kwend: nullable TKwend = null is writable
1336
1337 # The list of declared callbacks (for extern methods)
1338 var n_extern_calls: nullable AExternCalls = null is writable
1339
1340 # The body (in extern code) of the method, if any
1341 var n_extern_code_block: nullable AExternCodeBlock = null is writable
1342
1343 redef fun hot_location
1344 do
1345 if n_methid != null then
1346 return n_methid.location
1347 else if n_kwinit != null then
1348 return n_kwinit.location
1349 else if n_kwnew != null then
1350 return n_kwnew.location
1351 else
1352 return location
1353 end
1354 end
1355 end
1356
1357 # The implicit main method
1358 class AMainMethPropdef
1359 super AMethPropdef
1360 end
1361
1362 class AAnnotPropdef
1363 super APropdef
1364 super AAnnotation
1365 end
1366
1367 # A super-class. eg `super X`
1368 class ASuperPropdef
1369 super APropdef
1370
1371 # The super keyword
1372 var n_kwsuper: TKwsuper is writable, noinit
1373
1374 # The super-class (indicated as a type)
1375 var n_type: AType is writable, noinit
1376 end
1377
1378
1379 # Declaration of callbacks for extern methods
1380 class AExternCalls
1381 super Prod
1382
1383 # The `import` keyword
1384 var n_kwimport: TKwimport is writable, noinit
1385
1386 # The list of declared callbacks
1387 var n_extern_calls: ANodes[AExternCall] = new ANodes[AExternCall](self)
1388 end
1389
1390 # A single callback declaration
1391 abstract class AExternCall
1392 super Prod
1393 end
1394
1395 # A single callback declaration on a method
1396 abstract class APropExternCall
1397 super AExternCall
1398 end
1399
1400 # A single callback declaration on a method on the current receiver
1401 class ALocalPropExternCall
1402 super APropExternCall
1403
1404 # The name of the called-back method
1405 var n_methid: AMethid is writable, noinit
1406 end
1407
1408 # A single callback declaration on a method on an explicit receiver type.
1409 class AFullPropExternCall
1410 super APropExternCall
1411
1412 # The type of the receiver of the called-back method
1413 var n_type: AType is writable, noinit
1414
1415 # The dot `.`
1416 var n_dot: nullable TDot = null is writable
1417
1418 # The name of the called-back method
1419 var n_methid: AMethid is writable, noinit
1420 end
1421
1422 # A single callback declaration on a method on a constructor
1423 class AInitPropExternCall
1424 super APropExternCall
1425
1426 # The allocated type
1427 var n_type: AType is writable, noinit
1428 end
1429
1430 # A single callback declaration on a `super` call
1431 class ASuperExternCall
1432 super AExternCall
1433
1434 # The `super` keyword
1435 var n_kwsuper: TKwsuper is writable, noinit
1436 end
1437
1438 # A single callback declaration on a cast
1439 abstract class ACastExternCall
1440 super AExternCall
1441 end
1442
1443 # A single callback declaration on a cast to a given type
1444 class ACastAsExternCall
1445 super ACastExternCall
1446
1447 # The origin type of the cast
1448 var n_from_type: AType is writable, noinit
1449
1450 # The dot (`.`)
1451 var n_dot: nullable TDot = null is writable
1452
1453 # The `as` keyword
1454 var n_kwas: TKwas is writable, noinit
1455
1456 # The destination of the cast
1457 var n_to_type: AType is writable, noinit
1458 end
1459
1460 # A single callback declaration on a cast to a nullable type
1461 class AAsNullableExternCall
1462 super ACastExternCall
1463
1464 # The origin type to cast as nullable
1465 var n_type: AType is writable, noinit
1466
1467 # The `as` keyword
1468 var n_kwas: TKwas is writable, noinit
1469
1470 # The `nullable` keyword
1471 var n_kwnullable: TKwnullable is writable, noinit
1472 end
1473
1474 # A single callback declaration on a cast to a non-nullable type
1475 class AAsNotNullableExternCall
1476 super ACastExternCall
1477
1478 # The destination type on a cast to not nullable
1479 var n_type: AType is writable, noinit
1480
1481 # The `as` keyword.
1482 var n_kwas: TKwas is writable, noinit
1483
1484 # The `not` keyword
1485 var n_kwnot: TKwnot is writable, noinit
1486
1487 # The `nullable` keyword
1488 var n_kwnullable: TKwnullable is writable, noinit
1489 end
1490
1491 # A definition of a virtual type
1492 class ATypePropdef
1493 super APropdef
1494
1495 # The `type` keyword
1496 var n_kwtype: TKwtype is writable, noinit
1497
1498 # The name of the virtual type
1499 var n_id: TClassid is writable, noinit
1500
1501 # The bound of the virtual type
1502 var n_type: AType is writable, noinit
1503 end
1504
1505 # The identifier of a method in a method declaration.
1506 # There is a specific class because of operator and setters.
1507 abstract class AMethid
1508 super Prod
1509 end
1510
1511 # A method name with a simple identifier
1512 class AIdMethid
1513 super AMethid
1514
1515 # The simple identifier
1516 var n_id: TId is writable, noinit
1517 end
1518
1519 # A method name for an operator
1520 class AOperatorMethid
1521 super AMethid
1522
1523 # The associated operator symbol
1524 var n_op: Token is writable, noinit
1525 end
1526 # A method name `+`
1527 class APlusMethid
1528 super AOperatorMethid
1529 end
1530
1531 # A method name `-`
1532 class AMinusMethid
1533 super AOperatorMethid
1534 end
1535
1536 # A method name `*`
1537 class AStarMethid
1538 super AOperatorMethid
1539 end
1540
1541 # A method name `**`
1542 class AStarstarMethid
1543 super AOperatorMethid
1544 end
1545
1546 # A method name `/`
1547 class ASlashMethid
1548 super AOperatorMethid
1549 end
1550
1551 # A method name `%`
1552 class APercentMethid
1553 super AOperatorMethid
1554 end
1555
1556 # A method name `|`
1557 class APipeMethid
1558 super AOperatorMethid
1559 end
1560
1561 # A method name `^`
1562 class ACaretMethid
1563 super AOperatorMethid
1564 end
1565
1566 # A method name `&`
1567 class AAmpMethid
1568 super AOperatorMethid
1569 end
1570
1571 # A method name `~`
1572 class ATildeMethid
1573 super AOperatorMethid
1574 end
1575
1576 # A method name `==`
1577 class AEqMethid
1578 super AOperatorMethid
1579 end
1580
1581 # A method name `!=`
1582 class ANeMethid
1583 super AOperatorMethid
1584 end
1585
1586 # A method name `<=`
1587 class ALeMethid
1588 super AOperatorMethid
1589 end
1590
1591 # A method name `>=`
1592 class AGeMethid
1593 super AOperatorMethid
1594 end
1595
1596 # A method name `<`
1597 class ALtMethid
1598 super AOperatorMethid
1599 end
1600
1601 # A method name `>`
1602 class AGtMethid
1603 super AOperatorMethid
1604 end
1605
1606 # A method name `<<`
1607 class ALlMethid
1608 super AOperatorMethid
1609 end
1610
1611 # A method name `>>`
1612 class AGgMethid
1613 super AOperatorMethid
1614 end
1615
1616 # A method name `<=>`
1617 class AStarshipMethid
1618 super AOperatorMethid
1619 end
1620
1621 # A method name `[]`
1622 class ABraMethid
1623 super AMethid
1624
1625 # The `[` symbol
1626 var n_obra: TObra is writable, noinit
1627
1628 # The `]` symbol
1629 var n_cbra: TCbra is writable, noinit
1630 end
1631
1632 # A setter method name with a simple identifier (with a `=`)
1633 class AAssignMethid
1634 super AMethid
1635
1636 # The base identifier
1637 var n_id: TId is writable, noinit
1638
1639 # The `=` symbol
1640 var n_assign: TAssign is writable, noinit
1641 end
1642
1643 # A method name `[]=`
1644 class ABraassignMethid
1645 super AMethid
1646
1647 # The `[` symbol
1648 var n_obra: TObra is writable, noinit
1649
1650 # The `]` symbol
1651 var n_cbra: TCbra is writable, noinit
1652
1653 # The `=` symbol
1654 var n_assign: TAssign is writable, noinit
1655 end
1656
1657 # A signature in a method definition. eg `(x,y:X,z:Z):T`
1658 class ASignature
1659 super Prod
1660
1661 # The `(` symbol
1662 var n_opar: nullable TOpar = null is writable
1663
1664 # The list of parameters
1665 var n_params = new ANodes[AParam](self)
1666
1667 # The `)` symbol
1668 var n_cpar: nullable TCpar = null is writable
1669
1670 # The return type
1671 var n_type: nullable AType = null is writable
1672 end
1673
1674 # A parameter definition in a signature. eg `x:X`
1675 class AParam
1676 super Prod
1677
1678 # The name of the parameter
1679 var n_id: TId is writable, noinit
1680
1681 # The type of the parameter, if any
1682 var n_type: nullable AType = null is writable
1683
1684 # The `...` symbol to indicate varargs
1685 var n_dotdotdot: nullable TDotdotdot = null is writable
1686 end
1687
1688 # A static type. eg `nullable X[Y]`
1689 class AType
1690 super Prod
1691 # The `nullable` keyword
1692 var n_kwnullable: nullable TKwnullable = null is writable
1693
1694 # The name of the class or of the formal type
1695 var n_id: TClassid is writable, noinit
1696
1697 # The opening bracket
1698 var n_obra: nullable TObra = null is writable
1699
1700 # Type arguments for a generic type
1701 var n_types = new ANodes[AType](self)
1702
1703 # The closing bracket
1704 var n_cbra: nullable TCbra = null is writable
1705 end
1706
1707 # A label at the end of a block or in a break/continue statement. eg `label x`
1708 class ALabel
1709 super Prod
1710
1711 # The `label` keyword
1712 var n_kwlabel: TKwlabel is writable, noinit
1713
1714 # The name of the label, if any
1715 var n_id: nullable TId is writable, noinit
1716 end
1717
1718 # Expression and statements
1719 # From a AST point of view there is no distinction between statement and expressions (even if the parser has to distinguish them)
1720 abstract class AExpr
1721 super Prod
1722 end
1723
1724 # A sequence of `AExpr` (usually statements)
1725 # The last `AExpr` gives the value of the whole block
1726 class ABlockExpr
1727 super AExpr
1728
1729 # The list of statements in the bloc.
1730 # The last element is often considered as an expression that give the value of the whole block.
1731 var n_expr = new ANodes[AExpr](self)
1732
1733 # The `end` keyword
1734 var n_kwend: nullable TKwend = null is writable
1735 end
1736
1737 # A declaration of a local variable. eg `var x: X = y`
1738 class AVardeclExpr
1739 super AExpr
1740
1741 # The `var` keyword
1742 var n_kwvar: nullable TKwvar = null is writable
1743
1744 # The name of the local variable
1745 var n_id: TId is writable, noinit
1746
1747 # The declaration type of the local variable
1748 var n_type: nullable AType = null is writable
1749
1750 # The `=` symbol (for the initial value)
1751 var n_assign: nullable TAssign = null is writable
1752
1753 # The initial value, if any
1754 var n_expr: nullable AExpr = null is writable
1755 end
1756
1757 # A `return` statement. eg `return x`
1758 class AReturnExpr
1759 super AExpr
1760
1761 # The `return` keyword
1762 var n_kwreturn: nullable TKwreturn = null is writable
1763
1764 # The return value, if any
1765 var n_expr: nullable AExpr = null is writable
1766 end
1767
1768 # Something that has a label.
1769 abstract class ALabelable
1770 super Prod
1771
1772 # The associated label declatation
1773 var n_label: nullable ALabel = null is writable
1774 end
1775
1776 # A `break` or a `continue`
1777 abstract class AEscapeExpr
1778 super AExpr
1779 super ALabelable
1780
1781 # The return value, if nay (unused currently)
1782 var n_expr: nullable AExpr = null is writable
1783 end
1784
1785 # A `break` statement.
1786 class ABreakExpr
1787 super AEscapeExpr
1788
1789 # The `break` keyword
1790 var n_kwbreak: TKwbreak is writable, noinit
1791 end
1792
1793 # An `abort` statement
1794 class AAbortExpr
1795 super AExpr
1796
1797 # The `abort` keyword
1798 var n_kwabort: TKwabort is writable, noinit
1799 end
1800
1801 # A `continue` statement
1802 class AContinueExpr
1803 super AEscapeExpr
1804
1805 # The `continue` keyword.
1806 var n_kwcontinue: nullable TKwcontinue = null is writable
1807 end
1808
1809 # A `do` statement
1810 class ADoExpr
1811 super AExpr
1812 super ALabelable
1813
1814 # The `do` keyword
1815 var n_kwdo: TKwdo is writable, noinit
1816
1817 # The list of statements of the `do`.
1818 var n_block: nullable AExpr = null is writable
1819 end
1820
1821 # A `if` statement
1822 class AIfExpr
1823 super AExpr
1824
1825 # The `if` keyword
1826 var n_kwif: TKwif is writable, noinit
1827
1828 # The expression used as the condition of the `if`
1829 var n_expr: AExpr is writable, noinit
1830
1831 # The `then` keyword
1832 var n_kwthen: TKwthen is writable, noinit
1833
1834 # The body of the `then` part
1835 var n_then: nullable AExpr = null is writable
1836
1837 # The `else` keyword
1838 var n_kwelse: nullable TKwelse = null is writable
1839
1840 # The body of the `else` part
1841 var n_else: nullable AExpr = null is writable
1842 end
1843
1844 # A `if` expression (ternary conditional). eg. `if true then 1 else 0`
1845 class AIfexprExpr
1846 super AExpr
1847
1848 # The `if` keyword
1849 var n_kwif: TKwif is writable, noinit
1850
1851 # The expression used as the condition of the `if`
1852 var n_expr: AExpr is writable, noinit
1853
1854 # The `then` keyword
1855 var n_kwthen: TKwthen is writable, noinit
1856
1857 # The expression in the `then` part
1858 var n_then: AExpr is writable, noinit
1859
1860 # The `else` keyword
1861 var n_kwelse: TKwelse is writable, noinit
1862
1863 # The expression in the `else` part
1864 var n_else: AExpr is writable, noinit
1865 end
1866
1867 # A `while` statement
1868 class AWhileExpr
1869 super AExpr
1870 super ALabelable
1871
1872 # The `while` keyword
1873 var n_kwwhile: TKwwhile is writable, noinit
1874
1875 # The expression used as the condition of the `while`
1876 var n_expr: AExpr is writable, noinit
1877
1878 # The `do` keyword
1879 var n_kwdo: TKwdo is writable, noinit
1880
1881 # The body of the loop
1882 var n_block: nullable AExpr = null is writable
1883 end
1884
1885 # A `loop` statement
1886 class ALoopExpr
1887 super AExpr
1888 super ALabelable
1889
1890 # The `loop` keyword
1891 var n_kwloop: TKwloop is writable, noinit
1892
1893 # The body of the loop
1894 var n_block: nullable AExpr = null is writable
1895 end
1896
1897 # A `for` statement
1898 class AForExpr
1899 super AExpr
1900 super ALabelable
1901
1902 # The `for` keyword
1903 var n_kwfor: TKwfor is writable, noinit
1904
1905 # The list of name of the automatic variables
1906 var n_ids = new ANodes[TId](self)
1907
1908 # The `in` keyword
1909 var n_kwin: TKwin is writable, noinit
1910
1911 # The expression used as the collection to iterate on
1912 var n_expr: AExpr is writable, noinit
1913
1914 # The `do` keyword
1915 var n_kwdo: TKwdo is writable, noinit
1916
1917 # The body of the loop
1918 var n_block: nullable AExpr = null is writable
1919 end
1920
1921 # A `with` statement
1922 class AWithExpr
1923 super AExpr
1924 super ALabelable
1925
1926 # The `with` keyword
1927 var n_kwwith: TKwwith is writable, noinit
1928
1929 # The expression used to get the value to control
1930 var n_expr: AExpr is writable, noinit
1931
1932 # The `do` keyword
1933 var n_kwdo: TKwdo is writable, noinit
1934
1935 # The body of the loop
1936 var n_block: nullable AExpr = null is writable
1937 end
1938
1939 # An `assert` statement
1940 class AAssertExpr
1941 super AExpr
1942
1943 # The `assert` keyword
1944 var n_kwassert: TKwassert is writable, noinit
1945
1946 # The name of the assert, if any
1947 var n_id: nullable TId = null is writable
1948
1949 # The expression used as the condition of the `assert`
1950 var n_expr: AExpr is writable, noinit
1951
1952 # The `else` keyword
1953 var n_kwelse: nullable TKwelse = null is writable
1954
1955 # The body to execute when the assert fails
1956 var n_else: nullable AExpr = null is writable
1957 end
1958
1959 # Whatever is a simple assignment. eg `= something`
1960 abstract class AAssignFormExpr
1961 super AExpr
1962
1963 # The `=` symbol
1964 var n_assign: TAssign is writable, noinit
1965
1966 # The right-value to assign.
1967 var n_value: AExpr is writable, noinit
1968 end
1969
1970 # Whatever is a combined assignment. eg `+= something`
1971 abstract class AReassignFormExpr
1972 super AExpr
1973
1974 # The combined operator (eg. `+=`)
1975 var n_assign_op: AAssignOp is writable, noinit
1976
1977 # The right-value to apply on the combined operator.
1978 var n_value: AExpr is writable, noinit
1979 end
1980
1981 # A `once` expression. eg `once x`
1982 class AOnceExpr
1983 super AExpr
1984
1985 # The `once` keyword
1986 var n_kwonce: TKwonce is writable, noinit
1987
1988 # The expression to evaluate only one time
1989 var n_expr: AExpr is writable, noinit
1990 end
1991
1992 # A polymorphic invocation of a method
1993 # The form of the invocation (name, arguments, etc.) are specific
1994 abstract class ASendExpr
1995 super AExpr
1996 # The receiver of the method invocation
1997 var n_expr: AExpr is writable, noinit
1998 end
1999
2000 # A binary operation on a method
2001 abstract class ABinopExpr
2002 super ASendExpr
2003
2004 # The operator
2005 var n_op: Token is writable, noinit
2006
2007 # The second operand of the operation
2008 # Note: the receiver (`n_expr`) is the first operand
2009 var n_expr2: AExpr is writable, noinit
2010
2011 # The name of the operator (eg '+')
2012 fun operator: String is abstract
2013 end
2014
2015 # Something that is boolean expression
2016 abstract class ABoolExpr
2017 super AExpr
2018 end
2019
2020 # Something that is binary boolean expression
2021 abstract class ABinBoolExpr
2022 super ABoolExpr
2023
2024 # The first boolean operand
2025 var n_expr: AExpr is writable, noinit
2026
2027 # The operator
2028 var n_op: Token is writable, noinit
2029
2030 # The second boolean operand
2031 var n_expr2: AExpr is writable, noinit
2032 end
2033
2034 # A `or` expression
2035 class AOrExpr
2036 super ABinBoolExpr
2037 end
2038
2039 # A `and` expression
2040 class AAndExpr
2041 super ABinBoolExpr
2042 end
2043
2044 # A `or else` expression
2045 class AOrElseExpr
2046 super ABinBoolExpr
2047
2048 # The `else` keyword
2049 var n_kwelse: TKwelse is writable, noinit
2050 end
2051
2052 # A `implies` expression
2053 class AImpliesExpr
2054 super ABinBoolExpr
2055 end
2056
2057 # A `not` expression
2058 class ANotExpr
2059 super ABoolExpr
2060
2061 # The `not` keyword
2062 var n_kwnot: TKwnot is writable, noinit
2063
2064 # The boolean operand of the `not`
2065 var n_expr: AExpr is writable, noinit
2066 end
2067
2068 # A `==` expression
2069 class AEqExpr
2070 super ABinopExpr
2071 redef fun operator do return "=="
2072 end
2073
2074 # A `!=` expression
2075 class ANeExpr
2076 super ABinopExpr
2077 redef fun operator do return "!="
2078 end
2079
2080 # A `<` expression
2081 class ALtExpr
2082 super ABinopExpr
2083 redef fun operator do return "<"
2084 end
2085
2086 # A `<=` expression
2087 class ALeExpr
2088 super ABinopExpr
2089 redef fun operator do return "<="
2090 end
2091
2092 # A `<<` expression
2093 class ALlExpr
2094 super ABinopExpr
2095 redef fun operator do return "<<"
2096 end
2097
2098 # A `>` expression
2099 class AGtExpr
2100 super ABinopExpr
2101 redef fun operator do return ">"
2102 end
2103
2104 # A `>=` expression
2105 class AGeExpr
2106 super ABinopExpr
2107 redef fun operator do return ">="
2108 end
2109
2110 # A `>>` expression
2111 class AGgExpr
2112 super ABinopExpr
2113 redef fun operator do return ">>"
2114 end
2115
2116 # A type-ckeck expression. eg `x isa T`
2117 class AIsaExpr
2118 super ABoolExpr
2119
2120 # The expression to check
2121 var n_expr: AExpr is writable, noinit
2122
2123 # The `isa` keyword
2124 var n_kwisa: TKwisa is writable, noinit
2125
2126 # The destination type to check to
2127 var n_type: AType is writable, noinit
2128 end
2129
2130 # A `+` expression
2131 class APlusExpr
2132 super ABinopExpr
2133 redef fun operator do return "+"
2134 end
2135
2136 # A `-` expression
2137 class AMinusExpr
2138 super ABinopExpr
2139 redef fun operator do return "-"
2140 end
2141
2142 # A `<=>` expression
2143 class AStarshipExpr
2144 super ABinopExpr
2145 redef fun operator do return "<=>"
2146 end
2147
2148 # A `*` expression
2149 class AStarExpr
2150 super ABinopExpr
2151 redef fun operator do return "*"
2152 end
2153
2154 # A `**` expression
2155 class AStarstarExpr
2156 super ABinopExpr
2157 redef fun operator do return "**"
2158 end
2159
2160 # A `/` expression
2161 class ASlashExpr
2162 super ABinopExpr
2163 redef fun operator do return "/"
2164 end
2165
2166 # A `%` expression
2167 class APercentExpr
2168 super ABinopExpr
2169 redef fun operator do return "%"
2170 end
2171
2172 # A `|` expression
2173 class APipeExpr
2174 super ABinopExpr
2175 redef fun operator do return "|"
2176 end
2177
2178 # A `^` expression
2179 class ACaretExpr
2180 super ABinopExpr
2181 redef fun operator do return "^"
2182 end
2183
2184 # A `&` expression
2185 class AAmpExpr
2186 super ABinopExpr
2187 redef fun operator do return "&"
2188 end
2189
2190 # A unary operation on a method
2191 class AUnaryopExpr
2192 super ASendExpr
2193
2194 # The operator
2195 var n_op: Token is writable, noinit
2196
2197 # The name of the operator (eg '+')
2198 fun operator: String is abstract
2199 end
2200
2201 # A unary minus expression. eg `-x`
2202 class AUminusExpr
2203 super AUnaryopExpr
2204 redef fun operator do return "-"
2205 end
2206
2207 # A unary plus expression. eg `+x`
2208 class AUplusExpr
2209 super AUnaryopExpr
2210 redef fun operator do return "+"
2211 end
2212
2213 # A unary `~` expression
2214 class AUtildeExpr
2215 super AUnaryopExpr
2216 redef fun operator do return "~"
2217 end
2218
2219 # An explicit instantiation. eg `new T`
2220 class ANewExpr
2221 super AExpr
2222
2223 # The `new` keyword
2224 var n_kwnew: TKwnew is writable, noinit
2225
2226 # The `type` keyword
2227 var n_type: AType is writable, noinit
2228
2229 # The name of the named-constructor, if any
2230 var n_id: nullable TId = null is writable
2231
2232 # The arguments of the `new`
2233 var n_args: AExprs is writable, noinit
2234 end
2235
2236 # Whatever is a old-style attribute access
2237 abstract class AAttrFormExpr
2238 super AExpr
2239
2240 # The receiver of the attribute
2241 var n_expr: AExpr is writable, noinit
2242
2243 # The name of the attribute
2244 var n_id: TAttrid is writable, noinit
2245
2246 end
2247
2248 # The read of an attribute. eg `x._a`
2249 class AAttrExpr
2250 super AAttrFormExpr
2251 end
2252
2253 # The assignment of an attribute. eg `x._a=y`
2254 class AAttrAssignExpr
2255 super AAttrFormExpr
2256 super AAssignFormExpr
2257 end
2258
2259 # Whatever looks-like a call with a standard method and any number of arguments.
2260 abstract class ACallFormExpr
2261 super ASendExpr
2262
2263 # The name of the method
2264 var n_id: TId is writable, noinit
2265
2266 # The arguments of the call
2267 var n_args: AExprs is writable, noinit
2268 end
2269
2270 # A complex setter call (standard or brackets)
2271 abstract class ASendReassignFormExpr
2272 super ASendExpr
2273 super AReassignFormExpr
2274 end
2275
2276 # A complex attribute assignment. eg `x._a+=y`
2277 class AAttrReassignExpr
2278 super AAttrFormExpr
2279 super AReassignFormExpr
2280 end
2281
2282 # A call with a standard method-name and any number of arguments. eg `x.m(y)`. OR just a simple id
2283 # Note: because the parser cannot distinguish a variable read with a method call with an implicit receiver and no arguments, it always returns a `ACallExpr`.
2284 # Semantic analysis have to transform them to instance of `AVarExpr`.
2285 class ACallExpr
2286 super ACallFormExpr
2287 end
2288
2289 # A setter call with a standard method-name and any number of arguments. eg `x.m(y)=z`. OR just a simple assignment.
2290 # Note: because the parser cannot distinguish a variable write with a setter call with an implicit receiver and no arguments, it always returns a `ACallAssignExpr`.
2291 # Semantic analysis have to transform them to instance of `AVarAssignExpr`.
2292 class ACallAssignExpr
2293 super ACallFormExpr
2294 super AAssignFormExpr
2295 end
2296
2297 # A complex setter call with a standard method-name and any number of arguments. eg `x.m(y)+=z`. OR just a simple complex assignment.
2298 # Note: because the parser cannot distinguish a variable write with a complex setter call with an implicit receiver and no arguments, it always returns a `ACallReassignExpr`.
2299 # Semantic analysis have to transform them to instance of `AVarReassignExpr`.
2300 class ACallReassignExpr
2301 super ACallFormExpr
2302 super ASendReassignFormExpr
2303 end
2304
2305 # A call to `super`. OR a call of a super-constructor
2306 class ASuperExpr
2307 super AExpr
2308
2309 # The qualifier part before the super (currenlty unused)
2310 var n_qualified: nullable AQualified = null is writable
2311
2312 # The `super` keyword
2313 var n_kwsuper: TKwsuper is writable, noinit
2314
2315 # The arguments of the super
2316 var n_args: AExprs is writable, noinit
2317 end
2318
2319 # A call to the `init` constructor.
2320 # Note: because `init` is a keyword and not a `TId`, the explicit call to init cannot be a `ACallFormExpr`.
2321 class AInitExpr
2322 super ASendExpr
2323
2324 # The `init` keyword
2325 var n_kwinit: TKwinit is writable, noinit
2326
2327 # The arguments of the init
2328 var n_args: AExprs is writable, noinit
2329 end
2330
2331 # Whatever looks-like a call of the brackets `[]` operator.
2332 abstract class ABraFormExpr
2333 super ASendExpr
2334
2335 # The arguments inside the brackets
2336 var n_args: AExprs is writable, noinit
2337 end
2338
2339 # A call of the brackets operator. eg `x[y,z]`
2340 class ABraExpr
2341 super ABraFormExpr
2342 end
2343
2344 # A setter call of the bracket operator. eg `x[y,z]=t`
2345 class ABraAssignExpr
2346 super ABraFormExpr
2347 super AAssignFormExpr
2348 end
2349
2350 # Whatever is an access to a local variable
2351 abstract class AVarFormExpr
2352 super AExpr
2353
2354 # The name of the attribute
2355 var n_id: TId is writable, noinit
2356 end
2357
2358 # A complex setter call of the bracket operator. eg `x[y,z]+=t`
2359 class ABraReassignExpr
2360 super ABraFormExpr
2361 super ASendReassignFormExpr
2362 end
2363
2364 # A local variable read access.
2365 # The parser cannot instantiate them, see `ACallExpr`.
2366 class AVarExpr
2367 super AVarFormExpr
2368 end
2369
2370 # A local variable simple assignment access
2371 # The parser cannot instantiate them, see `ACallAssignExpr`.
2372 class AVarAssignExpr
2373 super AVarFormExpr
2374 super AAssignFormExpr
2375 end
2376
2377 # A local variable complex assignment access
2378 # The parser cannot instantiate them, see `ACallReassignExpr`.
2379 class AVarReassignExpr
2380 super AVarFormExpr
2381 super AReassignFormExpr
2382 end
2383
2384 # A literal range, open or closed
2385 abstract class ARangeExpr
2386 super AExpr
2387
2388 # The left (lower) element of the range
2389 var n_expr: AExpr is writable, noinit
2390
2391 # The `..`
2392 var n_dotdot: TDotdot is writable, noinit
2393
2394 # The right (upper) element of the range
2395 var n_expr2: AExpr is writable, noinit
2396 end
2397
2398 # A closed literal range. eg `[x..y]`
2399 class ACrangeExpr
2400 super ARangeExpr
2401
2402 # The opening bracket `[`
2403 var n_obra: TObra is writable, noinit
2404
2405 # The closing bracket `]`
2406 var n_cbra: TCbra is writable, noinit
2407 end
2408
2409 # An open literal range. eg `[x..y[`
2410 class AOrangeExpr
2411 super ARangeExpr
2412
2413 # The opening bracket `[`
2414 var n_obra: TObra is writable, noinit
2415
2416 # The closing bracket `[` (because open range)
2417 var n_cbra: TObra is writable, noinit
2418 end
2419
2420 # A literal array. eg. `[x,y,z]`
2421 class AArrayExpr
2422 super AExpr
2423
2424 # The opening bracket `[`
2425 var n_obra: TObra is writable, noinit
2426
2427 # The elements of the array
2428 var n_exprs = new ANodes[AExpr](self)
2429
2430 # The type of the element of the array (if any)
2431 var n_type: nullable AType = null is writable
2432
2433 # The closing bracket `]`
2434 var n_cbra: TCbra is writable, noinit
2435 end
2436
2437 # A read of `self`
2438 class ASelfExpr
2439 super AExpr
2440
2441 # The `self` keyword
2442 var n_kwself: nullable TKwself = null is writable
2443 end
2444
2445 # When there is no explicit receiver, `self` is implicit
2446 class AImplicitSelfExpr
2447 super ASelfExpr
2448 end
2449
2450 # A `true` boolean literal constant
2451 class ATrueExpr
2452 super ABoolExpr
2453
2454 # The `true` keyword
2455 var n_kwtrue: TKwtrue is writable, noinit
2456 end
2457
2458 # A `false` boolean literal constant
2459 class AFalseExpr
2460 super ABoolExpr
2461
2462 # The `false` keyword
2463 var n_kwfalse: TKwfalse is writable, noinit
2464 end
2465
2466 # A `null` literal constant
2467 class ANullExpr
2468 super AExpr
2469
2470 # The `null` keyword
2471 var n_kwnull: TKwnull is writable, noinit
2472 end
2473
2474 # An integer literal
2475 class AIntExpr
2476 super AExpr
2477 end
2478
2479 # An integer literal in decimal format
2480 class ADecIntExpr
2481 super AIntExpr
2482
2483 # The decimal token
2484 var n_number: TNumber is writable, noinit
2485 end
2486
2487 # An integer literal in hexadecimal format
2488 class AHexIntExpr
2489 super AIntExpr
2490
2491 # The hexadecimal token
2492 var n_hex_number: THexNumber is writable, noinit
2493 end
2494
2495 # An integer literal in binary format
2496 class ABinIntExpr
2497 super AIntExpr
2498
2499 # The binary token
2500 var n_bin_number: TBinNumber is writable, noinit
2501 end
2502
2503 # An integer literal in octal format
2504 class AOctIntExpr
2505 super AIntExpr
2506
2507 # The octal token
2508 var n_oct_number: TOctNumber is writable, noinit
2509 end
2510
2511 # An byte literal
2512 class AByteExpr
2513 super AExpr
2514 end
2515
2516 # An byte literal in decimal format
2517 class ADecByteExpr
2518 super AByteExpr
2519
2520 # The decimal token
2521 var n_bytenum: TBytenum is writable, noinit
2522 end
2523
2524 # An byte literal in hexadecimal format
2525 class AHexByteExpr
2526 super AByteExpr
2527
2528 # The hexadecimal token
2529 var n_hex_bytenum: THexBytenum is writable, noinit
2530 end
2531
2532 # An byte literal in binary format
2533 class ABinByteExpr
2534 super AByteExpr
2535
2536 # The binary token
2537 var n_bin_bytenum: TBinBytenum is writable, noinit
2538 end
2539
2540 # An byte literal in octal format
2541 class AOctByteExpr
2542 super AByteExpr
2543
2544 # The octal token
2545 var n_oct_bytenum: TOctBytenum is writable, noinit
2546 end
2547
2548 # A float literal
2549 class AFloatExpr
2550 super AExpr
2551
2552 # The float token
2553 var n_float: TFloat is writable, noinit
2554 end
2555
2556 # A character literal
2557 class ACharExpr
2558 super AExpr
2559
2560 # The character token
2561 var n_char: TChar is writable, noinit
2562 end
2563
2564 # A string literal
2565 abstract class AStringFormExpr
2566 super AExpr
2567
2568 # The string token
2569 var n_string: Token is writable, noinit
2570 end
2571
2572 # A simple string. eg. `"abc"`
2573 class AStringExpr
2574 super AStringFormExpr
2575 end
2576
2577 # The start of a superstring. eg `"abc{`
2578 class AStartStringExpr
2579 super AStringFormExpr
2580 end
2581
2582 # The middle of a superstring. eg `}abc{`
2583 class AMidStringExpr
2584 super AStringFormExpr
2585 end
2586
2587 # The end of a superstrng. eg `}abc"`
2588 class AEndStringExpr
2589 super AStringFormExpr
2590 end
2591
2592 # A superstring literal. eg `"a{x}b{y}c"`
2593 # Each part is modeled a sequence of expression. eg. `["a{, x, }b{, y, }c"]`
2594 class ASuperstringExpr
2595 super AExpr
2596
2597 # The list of the expressions of the superstring
2598 var n_exprs = new ANodes[AExpr](self)
2599 end
2600
2601 # A simple parenthesis. eg `(x)`
2602 class AParExpr
2603 super AExpr
2604
2605 # The opening parenthesis
2606 var n_opar: TOpar is writable, noinit
2607
2608 # The inner expression
2609 var n_expr: AExpr is writable, noinit
2610
2611 # The closing parenthesis
2612 var n_cpar: TCpar is writable, noinit
2613 end
2614
2615 # A cast, against a type or `not null`
2616 class AAsCastForm
2617 super AExpr
2618
2619 # The expression to cast
2620 var n_expr: AExpr is writable, noinit
2621
2622 # The `as` keyword
2623 var n_kwas: TKwas is writable, noinit
2624
2625 # The opening parenthesis
2626 var n_opar: nullable TOpar = null is writable
2627
2628 # The closing parenthesis
2629 var n_cpar: nullable TCpar = null is writable
2630 end
2631
2632 # A type cast. eg `x.as(T)`
2633 class AAsCastExpr
2634 super AAsCastForm
2635
2636 # The target type to cast to
2637 var n_type: AType is writable, noinit
2638 end
2639
2640 # A as-not-null cast. eg `x.as(not null)`
2641 class AAsNotnullExpr
2642 super AAsCastForm
2643
2644 # The `not` keyword
2645 var n_kwnot: TKwnot is writable, noinit
2646
2647 # The `null` keyword
2648 var n_kwnull: TKwnull is writable, noinit
2649 end
2650
2651 # A is-set check of old-style attributes. eg `isset x._a`
2652 class AIssetAttrExpr
2653 super AAttrFormExpr
2654
2655 # The `isset` keyword
2656 var n_kwisset: TKwisset is writable, noinit
2657 end
2658
2659 # An ellipsis notation used to pass an expression as it, in a vararg parameter
2660 class AVarargExpr
2661 super AExpr
2662
2663 # The passed expression
2664 var n_expr: AExpr is writable, noinit
2665
2666 # The `...` symbol
2667 var n_dotdotdot: TDotdotdot is writable, noinit
2668 end
2669
2670 # An named notation used to pass an expression by name in a parameter
2671 class ANamedargExpr
2672 super AExpr
2673
2674 # The name of the argument
2675 var n_id: TId is writable, noinit
2676
2677 # The `=` synbol
2678 var n_assign: TAssign is writable, noinit
2679
2680 # The passed expression
2681 var n_expr: AExpr is writable, noinit
2682 end
2683
2684 # A list of expression separated with commas (arguments for instance)
2685 class AManyExpr
2686 super AExpr
2687
2688 # The list of expressions
2689 var n_exprs = new ANodes[AExpr](self)
2690 end
2691
2692 # A special expression that encapsulates a static type
2693 # Can only be found in special construction like arguments of annotations.
2694 class ATypeExpr
2695 super AExpr
2696
2697 # The encapsulated type
2698 var n_type: AType is writable, noinit
2699 end
2700
2701 # A special expression that encapsulates a method identifier
2702 # Can only be found in special construction like arguments of annotations.
2703 class AMethidExpr
2704 super AExpr
2705
2706 # The receiver
2707 var n_expr: AExpr is writable, noinit
2708
2709 # The encapsulated method identifier
2710 var n_id: AMethid is writable, noinit
2711 end
2712
2713 # A special expression that encapsulate an annotation
2714 # Can only be found in special construction like arguments of annotations.
2715 #
2716 # The encapsulated annotations are in `n_annotations`
2717 class AAtExpr
2718 super AExpr
2719 end
2720
2721 # A special expression to debug types
2722 class ADebugTypeExpr
2723 super AExpr
2724
2725 # The `debug` keyword
2726 var n_kwdebug: TKwdebug is writable, noinit
2727
2728 # The `type` keyword
2729 var n_kwtype: TKwtype is writable, noinit
2730
2731 # The expression to check
2732 var n_expr: AExpr is writable, noinit
2733
2734 # The type to check
2735 var n_type: AType is writable, noinit
2736 end
2737
2738 # A list of expression separated with commas (arguments for instance)
2739 abstract class AExprs
2740 super Prod
2741
2742 # The list of expressions
2743 var n_exprs = new ANodes[AExpr](self)
2744 end
2745
2746 # A simple list of expressions
2747 class AListExprs
2748 super AExprs
2749 end
2750
2751 # A list of expressions enclosed in parentheses
2752 class AParExprs
2753 super AExprs
2754
2755 # The opening parenthesis
2756 var n_opar: TOpar is writable, noinit
2757
2758 # The closing parenthesis
2759 var n_cpar: TCpar is writable, noinit
2760 end
2761
2762 # A list of expressions enclosed in brackets
2763 class ABraExprs
2764 super AExprs
2765
2766 # The opening bracket
2767 var n_obra: TObra is writable, noinit
2768
2769 # The closing bracket
2770 var n_cbra: TCbra is writable, noinit
2771 end
2772
2773 # A complex assignment operator. (`+=` and `-=`)
2774 abstract class AAssignOp
2775 super Prod
2776
2777 # The combined assignment operator
2778 var n_op: Token is writable, noinit
2779
2780 # The name of the operator without the `=` (eg '+')
2781 fun operator: String is abstract
2782 end
2783
2784 # A `+=` assignment operation
2785 class APlusAssignOp
2786 super AAssignOp
2787
2788 redef fun operator do return "+"
2789 end
2790
2791 # A `-=` assignment operation
2792 class AMinusAssignOp
2793 super AAssignOp
2794
2795 redef fun operator do return "-"
2796 end
2797
2798 # A `*=` assignment operation
2799 class AStarAssignOp
2800 super AAssignOp
2801
2802 redef fun operator do return "*"
2803 end
2804
2805 # A `/=` assignment operation
2806 class ASlashAssignOp
2807 super AAssignOp
2808
2809 redef fun operator do return "/"
2810 end
2811
2812 # A `%=` assignment operation
2813 class APercentAssignOp
2814 super AAssignOp
2815
2816 redef fun operator do return "%"
2817 end
2818
2819 # A `**=` assignment operation
2820 class AStarstarAssignOp
2821 super AAssignOp
2822
2823 redef fun operator do return "**"
2824 end
2825
2826 # A `|=` assignment operation
2827 class APipeAssignOp
2828 super AAssignOp
2829
2830 redef fun operator do return "|"
2831 end
2832
2833 # A `^=` assignment operation
2834 class ACaretAssignOp
2835 super AAssignOp
2836
2837 redef fun operator do return "^"
2838 end
2839
2840 # A `&=` assignment operation
2841 class AAmpAssignOp
2842 super AAssignOp
2843
2844 redef fun operator do return "&"
2845 end
2846
2847 # A `<<=` assignment operation
2848 class ALlAssignOp
2849 super AAssignOp
2850
2851 redef fun operator do return "<<"
2852 end
2853
2854 # A `>>=` assignment operation
2855 class AGgAssignOp
2856 super AAssignOp
2857
2858 redef fun operator do return ">>"
2859 end
2860
2861 # A possibly fully-qualified module identifier
2862 class AModuleName
2863 super Prod
2864
2865 # The starting quad (`::`)
2866 var n_quad: nullable TQuad = null is writable
2867
2868 # The list of quad-separated project/group identifiers
2869 var n_path = new ANodes[TId](self)
2870
2871 # The final module identifier
2872 var n_id: TId is writable, noinit
2873 end
2874
2875 # A language declaration for an extern block
2876 class AInLanguage
2877 super Prod
2878
2879 # The `in` keyword
2880 var n_kwin: TKwin is writable, noinit
2881
2882 # The language name
2883 var n_string: TString is writable, noinit
2884 end
2885
2886 # An full extern block
2887 class AExternCodeBlock
2888 super Prod
2889
2890 # The language declration
2891 var n_in_language: nullable AInLanguage = null is writable
2892
2893 # The block of extern code
2894 var n_extern_code_segment: TExternCodeSegment is writable, noinit
2895 end
2896
2897 # A possible full method qualifier.
2898 class AQualified
2899 super Prod
2900
2901 # The starting quad (`::`)
2902 var n_quad: nullable TQuad = null is writable
2903
2904 # The list of quad-separated project/group/module identifiers
2905 var n_id = new ANodes[TId](self)
2906
2907 # A class identifier
2908 var n_classid: nullable TClassid = null is writable
2909 end
2910
2911 # A documentation of a definition
2912 # It contains the block of comments just above the declaration
2913 class ADoc
2914 super Prod
2915
2916 # A list of lines of comment
2917 var n_comment = new ANodes[TComment](self)
2918 end
2919
2920 # A group of annotation on a node
2921 #
2922 # This same class is used for the 3 kind of annotations:
2923 #
2924 # * *is* annotations. eg `module foo is bar`.
2925 # * *at* annotations. eg `foo@bar` or `foo@(bar,baz)`.
2926 # * *class* annotations, defined in classes.
2927 class AAnnotations
2928 super Prod
2929
2930 # The `is` keyword, for *is* annotations
2931 var n_kwis: nullable TKwis = null is writable
2932
2933 # The `@` symbol, for *at* annotations
2934 var n_at: nullable TAt = null is writable
2935
2936 # The opening parenthesis in *at* annotations
2937 var n_opar: nullable TOpar = null is writable
2938
2939 # The list of annotations
2940 var n_items = new ANodes[AAnnotation](self)
2941
2942 # The closing parenthesis in *at* annotations
2943 var n_cpar: nullable TCpar = null is writable
2944
2945 # The `end` keyword, for *is* annotations
2946 var n_kwend: nullable TKwend = null is writable
2947 end
2948
2949 # A single annotation
2950 class AAnnotation
2951 super ADefinition
2952
2953 # The name of the annotation
2954 var n_atid: AAtid is writable, noinit
2955
2956 # The opening parenthesis of the arguments
2957 var n_opar: nullable TOpar = null is writable
2958
2959 # The list of arguments
2960 var n_args = new ANodes[AExpr](self)
2961
2962 # The closing parenthesis
2963 var n_cpar: nullable TCpar = null is writable
2964
2965 # The name of the annotation
2966 fun name: String
2967 do
2968 return n_atid.n_id.text
2969 end
2970 end
2971
2972 # An annotation name
2973 abstract class AAtid
2974 super Prod
2975
2976 # The identifier of the annotation.
2977 # Can be a TId of a keyword
2978 var n_id: Token is writable, noinit
2979 end
2980
2981 # An annotation name based on an identifier
2982 class AIdAtid
2983 super AAtid
2984 end
2985
2986 # An annotation name based on the keyword `extern`
2987 class AKwexternAtid
2988 super AAtid
2989 end
2990
2991 # An annotation name based on the keyword `import`
2992 class AKwimportAtid
2993 super AAtid
2994 end
2995
2996 # An annotation name based on the keyword `abstract`
2997 class AKwabstractAtid
2998 super AAtid
2999 end
3000
3001 # The root of the AST
3002 class Start
3003 super Prod
3004
3005 # The main module
3006 var n_base: nullable AModule is writable
3007
3008 # The end of file (or error) token
3009 var n_eof: EOF is writable
3010 end