| """ |
| All the known base syntax kinds. These will all be considered non-final classes |
| and other types will be allowed to inherit from them. |
| """ |
| SYNTAX_BASE_KINDS = ['Decl', 'Expr', 'Pattern', 'Stmt', |
| 'Syntax', 'SyntaxCollection', 'Type'] |
| |
| |
| def kind_to_type(kind): |
| """ |
| Converts a SyntaxKind to a type name, checking to see if the kind is |
| Syntax or SyntaxCollection first. |
| A type name is the same as the SyntaxKind name with the suffix "Syntax" |
| added. |
| """ |
| if kind in ["Syntax", "SyntaxCollection"]: |
| return kind |
| if kind.endswith("Token"): |
| return "TokenSyntax" |
| return kind + "Syntax" |
| |
| |
| def lowercase_first_word(name): |
| """ |
| Lowercases the first word in the provided camelCase or PascalCase string. |
| EOF -> eof |
| IfKeyword -> ifKeyword |
| EOFToken -> eofToken |
| """ |
| word_index = 0 |
| threshold_index = 1 |
| for c in name: |
| if c.islower(): |
| if word_index > threshold_index: |
| word_index -= 1 |
| break |
| word_index += 1 |
| if word_index == 0: |
| return name |
| return name[:word_index].lower() + name[word_index:] |