languagetool-org/languagetool · error · IllegalArgumentException
WordWithDeterminerFilter: undefined parameters wordFrom or d
Error message
WordWithDeterminerFilter: undefined parameters wordFrom or determinerFrom in " + match.getRule().getFullId()
What it means
WordWithDeterminerFilter.acceptRuleMatch throws this IllegalArgumentException when either the wordFrom or determinerFrom parameter is missing entirely from the filter's args in the rule XML. It is a configuration completeness check performed before any positional logic runs.
Source
Thrown at languagetool-language-modules/fr/src/main/java/org/languagetool/rules/fr/WordWithDeterminerFilter.java:73
AnalyzedTokenReadings[] patternTokens, List<Integer> tokenPositions) throws IOException {
JLanguageTool lt = Languages.getLanguageForShortCode("fr").createDefaultJLanguageTool();
String wordFrom = getRequired("wordFrom", arguments);
String determinerFrom = getRequired("determinerFrom", arguments);
int posWord = 0;
int posDeterminer = 0;
if (wordFrom != null && determinerFrom != null) {
posWord = Integer.parseInt(wordFrom);
if (posWord < 1 || posWord > patternTokens.length) {
throw new IllegalArgumentException("WordWithDeterminerFilter: Index out of bounds in "
+ match.getRule().getFullId() + ", wordFrom: " + posWord);
}
posDeterminer = Integer.parseInt(determinerFrom);
if (posDeterminer < 1 || posDeterminer > patternTokens.length) {
throw new IllegalArgumentException("WordWithDeterminerFilter: Index out of bounds in "
+ match.getRule().getFullId() + ", posDeterminer: " + posWord);
}
} else {
throw new IllegalArgumentException("WordWithDeterminerFilter: undefined parameters wordFrom or determinerFrom in "
+ match.getRule().getFullId());
}
AnalyzedTokenReadings atrDeterminer = patternTokens[posDeterminer - 1];
AnalyzedTokenReadings atrWord = patternTokens[posWord - 1];
boolean isDeterminerCapitalized = StringTools.isCapitalizedWord(atrDeterminer.getToken());
boolean isWordCapitalized = StringTools.isCapitalizedWord(atrWord.getToken());
boolean isDeterminerAllupper = StringTools.isAllUppercase(atrDeterminer.getToken())
&& !atrDeterminer.getToken().equalsIgnoreCase("L'");
boolean isWordAllupper = StringTools.isAllUppercase(atrWord.getToken());
AnalyzedToken atDeterminer = getAnalyzedToken(atrDeterminer, detPattern);
AnalyzedToken atWord = getAnalyzedToken(atrWord, wordPattern);
if (atWord == null || atDeterminer == null) {
throw new RuntimeException(
"Error analyzing sentence: '" + match.getSentence().getText() + "' with rule " + match.getRule().getFullId());
}
boolean isNoun = atWord.getPOSTag().startsWith("N") || atWord.getPOSTag().startsWith("Z");
boolean isAdjective = atWord.getPOSTag().startsWith("J");
// boolean isParticiple = atWord.getPOSTag().startsWith("V");View on GitHub (pinned to 2e990059ce)
Solutions
- Add both wordFrom and determinerFrom arguments to the filter element in the rule XML named by the message.
- Check argument spelling/case against WordWithDeterminerFilter's expected parameter names.
- Remove the filter element entirely if the rule does not actually need determiner logic.
- Run LanguageTool's XML rule validation (tests or the rule editor) before deploying the rule.
Example fix
// before <filter class="org.languagetool.rules.fr.WordWithDeterminerFilter" args="wordFrom:2"/> // after <filter class="org.languagetool.rules.fr.WordWithDeterminerFilter" args="wordFrom:2 determinerFrom:1"/>
Defensive patterns
Strategy: validation
Validate before calling
if (!attrs.containsKey("wordFrom") || !attrs.containsKey("determinerFrom"))
throw new IllegalArgumentException("WordWithDeterminerFilter requires wordFrom and determinerFrom"); Try / catch
try { filter.acceptRuleMatch(match); } catch (IllegalArgumentException e) { reportMissingFilterArgs(e.getMessage()); } Prevention
- Copy filter argument blocks from working rules verbatim
- Run the rule editor/validator before deploying custom rules
- Keep wordFrom/determinerFrom adjacent in the XML for readability
When it happens
Trigger: A French rule XML references WordWithDeterminerFilter but omits the wordFrom or determinerFrom attribute (or misspells it), so the else branch fires instead of parsing an integer.
Common situations: Writing a new custom rule and forgetting the filter arguments; typos in argument names (e.g. 'wordfrom'); removing arguments during refactoring while keeping the filter class reference.
Understand the failure class
Background: "missing required argument" and "the following required arguments were not provided": what required-argument errors mean and how to fix them — this error's family across 20 libraries.
Related errors
- Set only 'weekDay' and 'date' for " + DMYDateCheckFilter.cla
- ConfusionCheckFilter: Index out of bounds in " + match.getRu
- ConfusionCheckFilter: Index out of bounds in " + match.getRu
- WordWithDeterminerFilter: Index out of bounds in " + match.g
- WordWithDeterminerFilter: Index out of bounds in " + match.g
AI-assisted analysis of languagetool-org/languagetool@2e990059ce (2026-09-06).
Data as JSON: /api/errors/c94cddc3537b77cf.
Report an issue: GitHub.