@@ -6,6 +6,7 @@ import * as messages from '@cucumber/messages'
6
6
import { TokenType } from './Parser'
7
7
import ITokenMatcher from './ITokenMatcher'
8
8
import countSymbols from './countSymbols'
9
+ import { compareStepKeywords } from './compareStepKeywords'
9
10
10
11
const DIALECT_DICT : { [ key : string ] : Dialect } = DIALECTS
11
12
const LANGUAGE_PATTERN = / ^ \s * # \s * l a n g u a g e \s * : \s * ( [ a - z A - Z \- _ ] + ) \s * $ /
@@ -25,6 +26,7 @@ export default class GherkinClassicTokenMatcher implements ITokenMatcher<TokenTy
25
26
private activeDocStringSeparator : string
26
27
private indentToRemove : number
27
28
private keywordTypesMap : { [ key : string ] : messages . StepKeywordType [ ] }
29
+ private sortedStepKeywords : readonly string [ ]
28
30
29
31
constructor ( private readonly defaultDialectName : string = 'en' ) {
30
32
this . reset ( )
@@ -39,6 +41,7 @@ export default class GherkinClassicTokenMatcher implements ITokenMatcher<TokenTy
39
41
this . dialectName = newDialectName
40
42
this . dialect = newDialect
41
43
this . initializeKeywordTypes ( )
44
+ this . initializeSortedStepKeywords ( )
42
45
}
43
46
44
47
reset ( ) {
@@ -59,6 +62,16 @@ export default class GherkinClassicTokenMatcher implements ITokenMatcher<TokenTy
59
62
messages . StepKeywordType . CONJUNCTION )
60
63
}
61
64
65
+ initializeSortedStepKeywords ( ) {
66
+ this . sortedStepKeywords = [ ]
67
+ . concat ( this . dialect . given )
68
+ . concat ( this . dialect . when )
69
+ . concat ( this . dialect . then )
70
+ . concat ( this . dialect . and )
71
+ . concat ( this . dialect . but )
72
+ . sort ( compareStepKeywords )
73
+ }
74
+
62
75
match_TagLine ( token : IToken < TokenType > ) {
63
76
if ( token . line . startsWith ( '@' ) ) {
64
77
this . setTokenMatched ( token , TokenType . TagLine , null , null , null , null , this . getTags ( token . line ) )
@@ -164,13 +177,7 @@ export default class GherkinClassicTokenMatcher implements ITokenMatcher<TokenTy
164
177
}
165
178
166
179
match_StepLine ( token : IToken < TokenType > ) {
167
- const keywords = [ ]
168
- . concat ( this . dialect . given )
169
- . concat ( this . dialect . when )
170
- . concat ( this . dialect . then )
171
- . concat ( this . dialect . and )
172
- . concat ( this . dialect . but )
173
- for ( const keyword of keywords ) {
180
+ for ( const keyword of this . sortedStepKeywords ) {
174
181
if ( token . line . startsWith ( keyword ) ) {
175
182
const title = token . line . getRestTrimmed ( keyword . length )
176
183
const keywordTypes = this . keywordTypesMap [ keyword ]
0 commit comments