GherkinExpression constructor
GherkinExpression(
- RegExp originalExpression,
- Iterable<
CustomParameter> customParameters
Implementation
GherkinExpression(
this.originalExpression,
Iterable<CustomParameter<dynamic>> customParameters,
) {
var pattern = originalExpression.pattern;
for (final p in customParameters) {
if (originalExpression.pattern.contains(p.identifier)) {
// we need the index in the original pattern to be able to
// transform the parameter into the correct type later on
// so get that then modify the new matching pattern.
originalExpression.pattern.replaceAllMapped(
RegExp(
_escapeIdentifier(p.identifier),
multiLine: true,
), (m) {
_sortedParameterPositions.add(_SortedParameterPosition(m.start, p));
return m.input;
});
pattern = pattern.replaceAllMapped(
RegExp(_escapeIdentifier(p.identifier), multiLine: true),
(m) => p.pattern.pattern,
);
}
}
// check for any capture patterns that are not custom parameters
// but defined directly in the step definition for example:
// Given I (open|close) the drawer(s)
// note that we should ignore the predefined (s) plural parameter
// and also ignore the (?:) non-capturing group pattern
var inCustomBracketSection = false;
int? indexOfOpeningBracket;
for (var i = 0; i < originalExpression.pattern.length; i += 1) {
final char = originalExpression.pattern[i];
if (char == '(') {
// look ahead and make sure we don't see "s)" or "?:" which would
// indicate the plural parameter or a non-capturing group
if (originalExpression.pattern.length > i + 2) {
final justAhead = originalExpression.pattern[i + 1] +
originalExpression.pattern[i + 2];
if (justAhead != 's)' && justAhead != '?:') {
inCustomBracketSection = true;
indexOfOpeningBracket = i;
}
}
} else if (char == ')' && inCustomBracketSection) {
_sortedParameterPositions.add(
_SortedParameterPosition(
indexOfOpeningBracket!,
UserDefinedStepParameterParameter(),
),
);
inCustomBracketSection = false;
indexOfOpeningBracket = 0;
}
}
_sortedParameterPositions.sort((a, b) => a.startPosition - b.startPosition);
_expression = RegExp(
pattern,
caseSensitive: originalExpression.isCaseSensitive,
multiLine: originalExpression.isMultiLine,
);
}