Skip to main content

syster/parser/
syntax_kind.rs

1//! Syntax kinds for the Rowan-based CST
2//!
3//! This enum defines all possible node and token kinds in the syntax tree.
4//! It follows the SysML v2 specification grammar structure.
5
6/// All syntax kinds (tokens and nodes) in SysML v2
7///
8/// Tokens are leaf nodes (identifiers, keywords, punctuation).
9/// Nodes are composite (packages, definitions, usages).
10#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
11#[repr(u16)]
12#[allow(non_camel_case_types)]
13pub enum SyntaxKind {
14    // =========================================================================
15    // TRIVIA (whitespace and comments - preserved but not semantically meaningful)
16    // =========================================================================
17    WHITESPACE = 0,
18    LINE_COMMENT,
19    BLOCK_COMMENT,
20
21    // =========================================================================
22    // LITERALS
23    // =========================================================================
24    IDENT,   // identifier
25    INTEGER, // 42
26    DECIMAL, // 3.14
27    STRING,  // "hello" or 'hello'
28
29    // =========================================================================
30    // PUNCTUATION
31    // =========================================================================
32    L_BRACE,           // {
33    R_BRACE,           // }
34    L_BRACKET,         // [
35    R_BRACKET,         // ]
36    L_PAREN,           // (
37    R_PAREN,           // )
38    SEMICOLON,         // ;
39    COLON,             // :
40    COLON_COLON,       // ::
41    COLON_GT,          // :>  (specializes/subsets)
42    COLON_GT_GT,       // :>> (redefines)
43    COLON_COLON_GT,    // ::> (references)
44    DOT,               // .
45    DOT_DOT,           // ..
46    COMMA,             // ,
47    EQ,                // =
48    EQ_EQ,             // ==
49    EQ_EQ_EQ,          // ===
50    BANG_EQ,           // !=
51    BANG_EQ_EQ,        // !==
52    LT,                // <
53    GT,                // >
54    LT_EQ,             // <=
55    GT_EQ,             // >=
56    ARROW,             // ->
57    FAT_ARROW,         // =>
58    AT,                // @
59    AT_AT,             // @@
60    HASH,              // #
61    STAR,              // *
62    STAR_STAR,         // **
63    PLUS,              // +
64    MINUS,             // -
65    SLASH,             // /
66    PERCENT,           // %
67    CARET,             // ^
68    TILDE,             // ~
69    QUESTION,          // ?
70    QUESTION_QUESTION, // ??
71    BANG,              // !
72    PIPE,              // |
73    AMP,               // &
74    AMP_AMP,           // &&
75    PIPE_PIPE,         // ||
76    COLON_EQ,          // :=
77    DOLLAR,            // $
78
79    // =========================================================================
80    // KEYWORDS - SysML v2
81    // =========================================================================
82    // Namespace keywords
83    PACKAGE_KW,
84    LIBRARY_KW,
85    STANDARD_KW,
86
87    // Import/visibility
88    IMPORT_KW,
89    ALIAS_KW,
90    ALL_KW,
91    FILTER_KW,
92    PRIVATE_KW,
93    PROTECTED_KW,
94    PUBLIC_KW,
95
96    // Definition keywords
97    DEF_KW,
98    ABSTRACT_KW,
99    COMPOSITE_KW,
100    PORTION_KW,
101    VARIATION_KW,
102    VARIANT_KW,
103
104    // Structure definitions
105    PART_KW,
106    ATTRIBUTE_KW,
107    ENUMERATION_KW,
108    ENUM_KW,
109    ITEM_KW,
110    OCCURRENCE_KW,
111    INDIVIDUAL_KW,
112
113    // Port/connection keywords
114    PORT_KW,
115    CONNECTION_KW,
116    INTERFACE_KW,
117    BINDING_KW,
118    FLOW_KW,
119    ALLOCATION_KW,
120    ALLOCATE_KW,
121
122    // Behavior keywords
123    ACTION_KW,
124    STATE_KW,
125    TRANSITION_KW,
126    ENTRY_KW,
127    EXIT_KW,
128    DO_KW,
129    ACCEPT_KW,
130    SEND_KW,
131    PERFORM_KW,
132    EXHIBIT_KW,
133
134    // Message/event keywords
135    MESSAGE_KW,
136    SNAPSHOT_KW,
137    TIMESLICE_KW,
138    FRAME_KW,
139    EVENT_KW,
140
141    // Control flow
142    IF_KW,
143    ELSE_KW,
144    THEN_KW,
145    LOOP_KW,
146    WHILE_KW,
147    UNTIL_KW,
148    FOR_KW,
149    FORK_KW,
150    JOIN_KW,
151    MERGE_KW,
152    DECIDE_KW,
153    FIRST_KW,
154    DONE_KW,
155    START_KW,
156    TERMINATE_KW,
157    PARALLEL_KW,
158    ASSIGN_KW,
159    CONNECT_KW,
160
161    // Action-specific
162    BIND_KW,
163    NEW_KW,
164    AFTER_KW,
165    AT_KW,
166    WHEN_KW,
167    VIA_KW,
168    THIS_KW,
169
170    // Calculation/constraint
171    CALC_KW,
172    CONSTRAINT_KW,
173    ASSERT_KW,
174    ASSUME_KW,
175    REQUIRE_KW,
176
177    // Requirement keywords
178    REQUIREMENT_KW,
179    SUBJECT_KW,
180    OBJECTIVE_KW,
181    STAKEHOLDER_KW,
182    ACTOR_KW,
183    CONCERN_KW,
184    SATISFY_KW,
185    VERIFY_KW,
186
187    // Case keywords
188    CASE_KW,
189    ANALYSIS_KW,
190    VERIFICATION_KW,
191    USE_KW,
192    INCLUDE_KW,
193
194    // View keywords
195    VIEW_KW,
196    VIEWPOINT_KW,
197    RENDERING_KW,
198    RENDER_KW,
199    EXPOSE_KW,
200
201    // Metadata
202    METACLASS_KW,
203    METADATA_KW,
204    ABOUT_KW,
205
206    // Documentation
207    DOC_KW,
208    COMMENT_KW,
209    LANGUAGE_KW,
210    LOCALE_KW,
211    REP_KW,
212
213    // Relationship keywords
214    SPECIALIZES_KW,
215    SUBSETS_KW,
216    REDEFINES_KW,
217    REFERENCES_KW,
218    TYPED_KW,
219    DEFINED_KW,
220    BY_KW,
221    INTERSECTS_KW,
222    UNIONS_KW,
223    DISJOINT_KW,
224    DISJOINING_KW,
225    CONJUGATES_KW,
226    CONJUGATE_KW,
227    DIFFERS_KW,
228    CROSSES_KW,
229    INVERSE_KW,
230    CHAINS_KW,
231    DIFFERENCES_KW,
232    FEATURED_KW,
233    FEATURING_KW,
234    INVERTING_KW,
235    OF_KW,
236
237    // Standalone relationship keywords
238    SPECIALIZATION_KW,
239    SUBCLASSIFIER_KW,
240    REDEFINITION_KW,
241    SUBSET_KW,
242    SUBTYPE_KW,
243    TYPING_KW,
244    CONJUGATION_KW,
245    MULTIPLICITY_KW,
246    NAMESPACE_KW,
247
248    // Feature modifiers
249    REF_KW,
250    READONLY_KW,
251    DERIVED_KW,
252    END_KW,
253    ORDERED_KW,
254    NONUNIQUE_KW,
255    DEFAULT_KW,
256    VAR_KW,
257    CONST_KW,
258    MEMBER_KW,
259    RETURN_KW,
260
261    // Direction
262    IN_KW,
263    OUT_KW,
264    INOUT_KW,
265
266    // Dependency
267    DEPENDENCY_KW,
268    FROM_KW,
269    TO_KW,
270
271    // Succession
272    SUCCESSION_KW,
273    FIRST_KW_2, // duplicate handling
274
275    // Boolean/null
276    TRUE_KW,
277    FALSE_KW,
278    NULL_KW,
279
280    // Logical operators
281    AND_KW,
282    OR_KW,
283    NOT_KW,
284    XOR_KW,
285    IMPLIES_KW,
286
287    // Classification
288    HASTYPE_KW,
289    ISTYPE_KW,
290    AS_KW,
291    META_KW,
292
293    // =========================================================================
294    // KEYWORDS - KerML (underlying language)
295    // =========================================================================
296    TYPE_KW,
297    CLASSIFIER_KW,
298    CLASS_KW,
299    STRUCT_KW,
300    DATATYPE_KW,
301    ASSOC_KW,
302    BEHAVIOR_KW,
303    FUNCTION_KW,
304    PREDICATE_KW,
305    INTERACTION_KW,
306    FEATURE_KW,
307    STEP_KW,
308    EXPR_KW,
309    CONNECTOR_KW,
310    INV_KW,
311
312    // =========================================================================
313    // COMPOSITE NODES (non-terminals in the grammar)
314    // =========================================================================
315    // Root
316    SOURCE_FILE,
317
318    // Namespace elements
319    PACKAGE,
320    LIBRARY_PACKAGE,
321    NAMESPACE_BODY,
322
323    // Member elements
324    PACKAGE_MEMBER,
325    ELEMENT_FILTER_MEMBER,
326    RELATIONSHIP_MEMBER,
327
328    // Annotations
329    COMMENT_ELEMENT,
330    DOCUMENTATION,
331    TEXTUAL_REP,
332    METADATA_USAGE,
333    PREFIX_METADATA,
334
335    // Import
336    IMPORT,
337    MEMBERSHIP_IMPORT,
338    NAMESPACE_IMPORT,
339    FILTER_PACKAGE,
340
341    // Alias
342    ALIAS_MEMBER,
343
344    // Dependencies
345    DEPENDENCY,
346
347    // Names and references
348    NAME,
349    SHORT_NAME,
350    QUALIFIED_NAME,
351    FEATURE_CHAIN,
352
353    // Definitions
354    DEFINITION,
355    DEFINITION_BODY,
356    DEFINITION_PREFIX,
357
358    // Definition kinds
359    PART_DEFINITION,
360    ATTRIBUTE_DEFINITION,
361    ENUMERATION_DEFINITION,
362    ITEM_DEFINITION,
363    OCCURRENCE_DEFINITION,
364    PORT_DEFINITION,
365    CONNECTION_DEFINITION,
366    INTERFACE_DEFINITION,
367    ALLOCATION_DEFINITION,
368    FLOW_DEFINITION,
369    ACTION_DEFINITION,
370    STATE_DEFINITION,
371    CALC_DEFINITION,
372    CONSTRAINT_DEFINITION,
373    REQUIREMENT_DEFINITION,
374    CASE_DEFINITION,
375    ANALYSIS_CASE_DEFINITION,
376    VERIFICATION_CASE_DEFINITION,
377    USE_CASE_DEFINITION,
378    VIEW_DEFINITION,
379    VIEWPOINT_DEFINITION,
380    RENDERING_DEFINITION,
381    METADATA_DEFINITION,
382
383    // Usages
384    USAGE,
385    USAGE_BODY,
386    USAGE_PREFIX,
387
388    // Usage kinds
389    PART_USAGE,
390    ATTRIBUTE_USAGE,
391    ENUM_USAGE,
392    ITEM_USAGE,
393    OCCURRENCE_USAGE,
394    PORT_USAGE,
395    CONNECTION_USAGE,
396    INTERFACE_USAGE,
397    ALLOCATION_USAGE,
398    FLOW_USAGE,
399    ACTION_USAGE,
400    STATE_USAGE,
401    CALC_USAGE,
402    CONSTRAINT_USAGE,
403    REQUIREMENT_USAGE,
404    CASE_USAGE,
405    ANALYSIS_CASE_USAGE,
406    VERIFICATION_CASE_USAGE,
407    USE_CASE_USAGE,
408    VIEW_USAGE,
409    VIEWPOINT_USAGE,
410    RENDERING_USAGE,
411
412    // Relationships
413    SPECIALIZATION,
414    SUBSETTING,
415    REDEFINITION,
416    TYPING,
417    FEATURING,
418    CONJUGATION,
419
420    // Multiplicity
421    MULTIPLICITY,
422    MULTIPLICITY_RANGE,
423
424    // Expressions
425    EXPRESSION,
426    LITERAL_EXPR,
427    FEATURE_REF_EXPR,
428    INVOCATION_EXPR,
429    SEQUENCE_EXPR,
430    CONDITIONAL_EXPR,
431    BINARY_EXPR,
432    UNARY_EXPR,
433    BRACKET_EXPR,
434    ARGUMENT_LIST,
435
436    // Body items
437    BODY_ITEM,
438    MEMBER,
439
440    // Additional node types for grammar modules
441    ACCEPT_ACTION_USAGE,
442    ACTOR_USAGE,
443    BINDING_CONNECTOR,
444    CONNECTION_END,
445    CONNECTOR,
446    CONNECTOR_END,
447    CONNECTOR_END_REFERENCE,
448    CONNECTOR_PART,
449    CONNECT_USAGE,
450    CONSTRAINT_BODY,
451    CONTROL_NODE,
452    FOR_LOOP_ACTION_USAGE,
453    IF_ACTION_USAGE,
454    OBJECTIVE_USAGE,
455    PERFORM_ACTION_USAGE,
456    RELATIONSHIP,
457    REQUIREMENT_CONSTRAINT,
458    REQUIREMENT_VERIFICATION,
459    SEND_ACTION_USAGE,
460    STAKEHOLDER_USAGE,
461    STATE_SUBACTION,
462    SUBJECT_USAGE,
463    SUCCESSION,
464    SUCCESSION_ITEM,
465    TEXTUAL_REPRESENTATION,
466    TRANSITION_USAGE,
467    WHILE_LOOP_ACTION_USAGE,
468    CONSTANT_KW,
469
470    // Message/flow from-to clause
471    FROM_TO_CLAUSE,
472    FROM_TO_SOURCE,
473    FROM_TO_TARGET,
474
475    // Special
476    ERROR,
477    TOMBSTONE, // For incremental reparsing
478
479    #[doc(hidden)]
480    __LAST,
481}
482
483impl SyntaxKind {
484    /// Check if this is a trivia token (whitespace or comment)
485    pub fn is_trivia(self) -> bool {
486        matches!(
487            self,
488            Self::WHITESPACE | Self::LINE_COMMENT | Self::BLOCK_COMMENT
489        )
490    }
491
492    /// Check if this is a keyword
493    pub fn is_keyword(self) -> bool {
494        (self as u16) >= (Self::PACKAGE_KW as u16) && (self as u16) <= (Self::INV_KW as u16)
495    }
496
497    /// Check if this is a punctuation token
498    pub fn is_punct(self) -> bool {
499        (self as u16) >= (Self::L_BRACE as u16) && (self as u16) <= (Self::PIPE_PIPE as u16)
500    }
501
502    /// Check if this is a literal
503    pub fn is_literal(self) -> bool {
504        matches!(
505            self,
506            Self::IDENT | Self::INTEGER | Self::DECIMAL | Self::STRING
507        )
508    }
509
510    /// Human-readable name for error messages (moved from `kind_to_name`)
511    pub fn display_name(self) -> &'static str {
512        match self {
513            // Trivia
514            Self::WHITESPACE => "whitespace",
515            Self::LINE_COMMENT => "comment",
516            Self::BLOCK_COMMENT => "comment",
517
518            // Literals
519            Self::IDENT => "identifier",
520            Self::INTEGER => "integer",
521            Self::DECIMAL => "number",
522            Self::STRING => "string",
523            Self::ERROR => "error",
524
525            // Punctuation
526            Self::SEMICOLON => "';'",
527            Self::COLON => "':'",
528            Self::COLON_COLON => "'::'",
529            Self::COLON_GT => "':>'",
530            Self::COLON_GT_GT => "':>>'",
531            Self::COLON_COLON_GT => "'::>'",
532            Self::COMMA => "','",
533            Self::DOT => "'.'",
534            Self::DOT_DOT => "'..'",
535            Self::L_PAREN => "'('",
536            Self::R_PAREN => "')'",
537            Self::L_BRACE => "'{'",
538            Self::R_BRACE => "'}'",
539            Self::L_BRACKET => "'['",
540            Self::R_BRACKET => "']'",
541            Self::LT => "'<'",
542            Self::GT => "'>'",
543            Self::LT_EQ => "'<='",
544            Self::GT_EQ => "'>='",
545            Self::EQ => "'='",
546            Self::EQ_EQ => "'=='",
547            Self::EQ_EQ_EQ => "'==='",
548            Self::BANG_EQ => "'!='",
549            Self::BANG_EQ_EQ => "'!=='",
550            Self::COLON_EQ => "':='",
551            Self::PLUS => "'+'",
552            Self::MINUS => "'-'",
553            Self::STAR => "'*'",
554            Self::STAR_STAR => "'**'",
555            Self::SLASH => "'/'",
556            Self::PERCENT => "'%'",
557            Self::CARET => "'^'",
558            Self::TILDE => "'~'",
559            Self::AMP => "'&'",
560            Self::AMP_AMP => "'&&'",
561            Self::PIPE => "'|'",
562            Self::PIPE_PIPE => "'||'",
563            Self::AT => "'@'",
564            Self::AT_AT => "'@@'",
565            Self::HASH => "'#'",
566            Self::QUESTION => "'?'",
567            Self::QUESTION_QUESTION => "'??'",
568            Self::BANG => "'!'",
569            Self::ARROW => "'->'",
570            Self::FAT_ARROW => "'=>'",
571            Self::DOLLAR => "'$'",
572
573            // Keywords - SysML v2
574            Self::PACKAGE_KW => "'package'",
575            Self::LIBRARY_KW => "'library'",
576            Self::STANDARD_KW => "'standard'",
577            Self::NAMESPACE_KW => "'namespace'",
578            Self::IMPORT_KW => "'import'",
579            Self::ALIAS_KW => "'alias'",
580            Self::ALL_KW => "'all'",
581            Self::FILTER_KW => "'filter'",
582            Self::PRIVATE_KW => "'private'",
583            Self::PROTECTED_KW => "'protected'",
584            Self::PUBLIC_KW => "'public'",
585            Self::DEF_KW => "'def'",
586            Self::ABSTRACT_KW => "'abstract'",
587            Self::COMPOSITE_KW => "'composite'",
588            Self::PORTION_KW => "'portion'",
589            Self::VARIATION_KW => "'variation'",
590            Self::VARIANT_KW => "'variant'",
591            Self::PART_KW => "'part'",
592            Self::ATTRIBUTE_KW => "'attribute'",
593            Self::ENUMERATION_KW => "'enumeration'",
594            Self::ENUM_KW => "'enum'",
595            Self::ITEM_KW => "'item'",
596            Self::OCCURRENCE_KW => "'occurrence'",
597            Self::INDIVIDUAL_KW => "'individual'",
598            Self::PORT_KW => "'port'",
599            Self::CONNECTION_KW => "'connection'",
600            Self::INTERFACE_KW => "'interface'",
601            Self::BINDING_KW => "'binding'",
602            Self::FLOW_KW => "'flow'",
603            Self::ALLOCATION_KW => "'allocation'",
604            Self::ALLOCATE_KW => "'allocate'",
605            Self::ACTION_KW => "'action'",
606            Self::STATE_KW => "'state'",
607            Self::TRANSITION_KW => "'transition'",
608            Self::ENTRY_KW => "'entry'",
609            Self::EXIT_KW => "'exit'",
610            Self::DO_KW => "'do'",
611            Self::ACCEPT_KW => "'accept'",
612            Self::SEND_KW => "'send'",
613            Self::PERFORM_KW => "'perform'",
614            Self::EXHIBIT_KW => "'exhibit'",
615            Self::MESSAGE_KW => "'message'",
616            Self::SNAPSHOT_KW => "'snapshot'",
617            Self::TIMESLICE_KW => "'timeslice'",
618            Self::FRAME_KW => "'frame'",
619            Self::EVENT_KW => "'event'",
620            Self::IF_KW => "'if'",
621            Self::ELSE_KW => "'else'",
622            Self::THEN_KW => "'then'",
623            Self::LOOP_KW => "'loop'",
624            Self::WHILE_KW => "'while'",
625            Self::UNTIL_KW => "'until'",
626            Self::FOR_KW => "'for'",
627            Self::FORK_KW => "'fork'",
628            Self::JOIN_KW => "'join'",
629            Self::MERGE_KW => "'merge'",
630            Self::DECIDE_KW => "'decide'",
631            Self::FIRST_KW => "'first'",
632            Self::DONE_KW => "'done'",
633            Self::START_KW => "'start'",
634            Self::TERMINATE_KW => "'terminate'",
635            Self::PARALLEL_KW => "'parallel'",
636            Self::ASSIGN_KW => "'assign'",
637            Self::CONNECT_KW => "'connect'",
638            Self::BIND_KW => "'bind'",
639            Self::NEW_KW => "'new'",
640            Self::AFTER_KW => "'after'",
641            Self::AT_KW => "'at'",
642            Self::WHEN_KW => "'when'",
643            Self::VIA_KW => "'via'",
644            Self::THIS_KW => "'this'",
645            Self::CALC_KW => "'calc'",
646            Self::CONSTRAINT_KW => "'constraint'",
647            Self::ASSERT_KW => "'assert'",
648            Self::ASSUME_KW => "'assume'",
649            Self::REQUIRE_KW => "'require'",
650            Self::REQUIREMENT_KW => "'requirement'",
651            Self::SUBJECT_KW => "'subject'",
652            Self::OBJECTIVE_KW => "'objective'",
653            Self::STAKEHOLDER_KW => "'stakeholder'",
654            Self::ACTOR_KW => "'actor'",
655            Self::CONCERN_KW => "'concern'",
656            Self::SATISFY_KW => "'satisfy'",
657            Self::VERIFY_KW => "'verify'",
658            Self::CASE_KW => "'case'",
659            Self::ANALYSIS_KW => "'analysis'",
660            Self::VERIFICATION_KW => "'verification'",
661            Self::USE_KW => "'use'",
662            Self::INCLUDE_KW => "'include'",
663            Self::VIEW_KW => "'view'",
664            Self::VIEWPOINT_KW => "'viewpoint'",
665            Self::RENDERING_KW => "'rendering'",
666            Self::RENDER_KW => "'render'",
667            Self::EXPOSE_KW => "'expose'",
668            Self::METACLASS_KW => "'metaclass'",
669            Self::METADATA_KW => "'metadata'",
670            Self::ABOUT_KW => "'about'",
671            Self::DOC_KW => "'doc'",
672            Self::COMMENT_KW => "'comment'",
673            Self::LANGUAGE_KW => "'language'",
674            Self::LOCALE_KW => "'locale'",
675            Self::REP_KW => "'rep'",
676            Self::SPECIALIZES_KW => "'specializes'",
677            Self::SUBSETS_KW => "'subsets'",
678            Self::REDEFINES_KW => "'redefines'",
679            Self::REFERENCES_KW => "'references'",
680            Self::TYPED_KW => "'typed'",
681            Self::DEFINED_KW => "'defined'",
682            Self::BY_KW => "'by'",
683            Self::INTERSECTS_KW => "'intersects'",
684            Self::UNIONS_KW => "'unions'",
685            Self::DISJOINT_KW => "'disjoint'",
686            Self::DISJOINING_KW => "'disjoining'",
687            Self::CONJUGATES_KW => "'conjugates'",
688            Self::CONJUGATE_KW => "'conjugate'",
689            Self::DIFFERS_KW => "'differs'",
690            Self::CROSSES_KW => "'crosses'",
691            Self::INVERSE_KW => "'inverse'",
692            Self::CHAINS_KW => "'chains'",
693            Self::DIFFERENCES_KW => "'differences'",
694            Self::FEATURED_KW => "'featured'",
695            Self::FEATURING_KW => "'featuring'",
696            Self::INVERTING_KW => "'inverting'",
697            Self::OF_KW => "'of'",
698            Self::SPECIALIZATION_KW => "'specialization'",
699            Self::SUBCLASSIFIER_KW => "'subclassifier'",
700            Self::REDEFINITION_KW => "'redefinition'",
701            Self::SUBSET_KW => "'subset'",
702            Self::SUBTYPE_KW => "'subtype'",
703            Self::TYPING_KW => "'typing'",
704            Self::CONJUGATION_KW => "'conjugation'",
705            Self::MULTIPLICITY_KW => "'multiplicity'",
706            Self::REF_KW => "'ref'",
707            Self::READONLY_KW => "'readonly'",
708            Self::DERIVED_KW => "'derived'",
709            Self::END_KW => "'end'",
710            Self::ORDERED_KW => "'ordered'",
711            Self::NONUNIQUE_KW => "'nonunique'",
712            Self::DEFAULT_KW => "'default'",
713            Self::VAR_KW => "'var'",
714            Self::CONST_KW => "'const'",
715            Self::CONSTANT_KW => "'constant'",
716            Self::MEMBER_KW => "'member'",
717            Self::RETURN_KW => "'return'",
718            Self::IN_KW => "'in'",
719            Self::OUT_KW => "'out'",
720            Self::INOUT_KW => "'inout'",
721            Self::DEPENDENCY_KW => "'dependency'",
722            Self::FROM_KW => "'from'",
723            Self::TO_KW => "'to'",
724            Self::SUCCESSION_KW => "'succession'",
725            Self::FIRST_KW_2 => "'first'",
726            Self::TRUE_KW => "'true'",
727            Self::FALSE_KW => "'false'",
728            Self::NULL_KW => "'null'",
729            Self::AND_KW => "'and'",
730            Self::OR_KW => "'or'",
731            Self::NOT_KW => "'not'",
732            Self::XOR_KW => "'xor'",
733            Self::IMPLIES_KW => "'implies'",
734            Self::HASTYPE_KW => "'hastype'",
735            Self::ISTYPE_KW => "'istype'",
736            Self::AS_KW => "'as'",
737            Self::META_KW => "'meta'",
738
739            // Keywords - KerML
740            Self::TYPE_KW => "'type'",
741            Self::CLASSIFIER_KW => "'classifier'",
742            Self::CLASS_KW => "'class'",
743            Self::STRUCT_KW => "'struct'",
744            Self::DATATYPE_KW => "'datatype'",
745            Self::ASSOC_KW => "'assoc'",
746            Self::BEHAVIOR_KW => "'behavior'",
747            Self::FUNCTION_KW => "'function'",
748            Self::PREDICATE_KW => "'predicate'",
749            Self::INTERACTION_KW => "'interaction'",
750            Self::FEATURE_KW => "'feature'",
751            Self::STEP_KW => "'step'",
752            Self::EXPR_KW => "'expr'",
753            Self::CONNECTOR_KW => "'connector'",
754            Self::INV_KW => "'inv'",
755
756            // Composite nodes
757            Self::SOURCE_FILE => "source file",
758            Self::PACKAGE => "package",
759            Self::LIBRARY_PACKAGE => "library package",
760            Self::NAMESPACE_BODY => "namespace body",
761            Self::IMPORT => "import",
762            Self::ALIAS_MEMBER => "alias",
763            Self::DEFINITION => "definition",
764            Self::USAGE => "usage",
765            Self::EXPRESSION => "expression",
766            Self::QUALIFIED_NAME => "qualified name",
767            Self::NAME => "name",
768            Self::MULTIPLICITY => "multiplicity",
769            Self::MULTIPLICITY_RANGE => "multiplicity range",
770
771            // Fallback
772            _ => "token",
773        }
774    }
775}
776
777impl From<SyntaxKind> for rowan::SyntaxKind {
778    fn from(kind: SyntaxKind) -> Self {
779        Self(kind as u16)
780    }
781}
782
783impl From<rowan::SyntaxKind> for SyntaxKind {
784    fn from(raw: rowan::SyntaxKind) -> Self {
785        assert!(raw.0 < SyntaxKind::__LAST as u16);
786        // Safety: we control all syntax kinds and check bounds above
787        unsafe { std::mem::transmute::<u16, SyntaxKind>(raw.0) }
788    }
789}
790
791/// Language definition for Rowan
792#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
793pub enum SysMLLanguage {}
794
795impl rowan::Language for SysMLLanguage {
796    type Kind = SyntaxKind;
797
798    fn kind_from_raw(raw: rowan::SyntaxKind) -> Self::Kind {
799        raw.into()
800    }
801
802    fn kind_to_raw(kind: Self::Kind) -> rowan::SyntaxKind {
803        kind.into()
804    }
805}
806
807/// Type aliases for convenience
808pub type SyntaxNode = rowan::SyntaxNode<SysMLLanguage>;
809pub type SyntaxToken = rowan::SyntaxToken<SysMLLanguage>;
810pub type SyntaxElement = rowan::SyntaxElement<SysMLLanguage>;
811#[allow(dead_code)]
812pub type SyntaxNodeChildren = rowan::SyntaxNodeChildren<SysMLLanguage>;