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

  1. Add both wordFrom and determinerFrom arguments to the filter element in the rule XML named by the message.
  2. Check argument spelling/case against WordWithDeterminerFilter's expected parameter names.
  3. Remove the filter element entirely if the rule does not actually need determiner logic.
  4. 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

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


AI-assisted analysis of languagetool-org/languagetool@2e990059ce (2026-09-06). Data as JSON: /api/errors/c94cddc3537b77cf. Report an issue: GitHub.