| 6dd74de | | | 1 | import type { GrammarAST, Stream, TokenBuilderOptions } from 'langium'; |
| 6dd74de | | | 2 | import type { TokenType } from 'chevrotain'; |
| 6dd74de | | | 3 | |
| 6dd74de | | | 4 | import { DefaultTokenBuilder } from 'langium'; |
| 6dd74de | | | 5 | |
| 6dd74de | | | 6 | export abstract class AbstractMermaidTokenBuilder extends DefaultTokenBuilder { |
| 6dd74de | | | 7 | private keywords: Set<string>; |
| 6dd74de | | | 8 | |
| 6dd74de | | | 9 | public constructor(keywords: string[]) { |
| 6dd74de | | | 10 | super(); |
| 6dd74de | | | 11 | this.keywords = new Set<string>(keywords); |
| 6dd74de | | | 12 | } |
| 6dd74de | | | 13 | |
| 6dd74de | | | 14 | protected override buildKeywordTokens( |
| 6dd74de | | | 15 | rules: Stream<GrammarAST.AbstractRule>, |
| 6dd74de | | | 16 | terminalTokens: TokenType[], |
| 6dd74de | | | 17 | options?: TokenBuilderOptions |
| 6dd74de | | | 18 | ): TokenType[] { |
| 6dd74de | | | 19 | const tokenTypes: TokenType[] = super.buildKeywordTokens(rules, terminalTokens, options); |
| 6dd74de | | | 20 | // to restrict users, they mustn't have any non-whitespace characters after the keyword. |
| 6dd74de | | | 21 | tokenTypes.forEach((tokenType: TokenType): void => { |
| 6dd74de | | | 22 | if (this.keywords.has(tokenType.name) && tokenType.PATTERN !== undefined) { |
| 6dd74de | | | 23 | // eslint-disable-next-line @typescript-eslint/no-base-to-string |
| 6dd74de | | | 24 | tokenType.PATTERN = new RegExp(tokenType.PATTERN.toString() + '(?:(?=%%)|(?!\\S))'); |
| 6dd74de | | | 25 | } |
| 6dd74de | | | 26 | }); |
| 6dd74de | | | 27 | return tokenTypes; |
| 6dd74de | | | 28 | } |
| 6dd74de | | | 29 | } |
| 6dd74de | | | 30 | |
| 6dd74de | | | 31 | export class CommonTokenBuilder extends AbstractMermaidTokenBuilder {} |