{"record":{"id":"c94cddc3537b77cf","repo":"languagetool-org/languagetool","slug":"wordwithdeterminerfilter-undefined-parameters-wor","errorCode":null,"errorMessage":"WordWithDeterminerFilter: undefined parameters wordFrom or determinerFrom in \" + match.getRule().getFullId()","messagePattern":"WordWithDeterminerFilter: undefined parameters wordFrom or determinerFrom in \" \\+ match\\.getRule\\(\\)\\.getFullId\\(\\)","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"languagetool-language-modules/fr/src/main/java/org/languagetool/rules/fr/WordWithDeterminerFilter.java","lineNumber":73,"sourceCode":"                                   AnalyzedTokenReadings[] patternTokens, List<Integer> tokenPositions) throws IOException {\n    JLanguageTool lt = Languages.getLanguageForShortCode(\"fr\").createDefaultJLanguageTool();\n    String wordFrom = getRequired(\"wordFrom\", arguments);\n    String determinerFrom = getRequired(\"determinerFrom\", arguments);\n    int posWord = 0;\n    int posDeterminer = 0;\n    if (wordFrom != null && determinerFrom != null) {\n      posWord = Integer.parseInt(wordFrom);\n      if (posWord < 1 || posWord > patternTokens.length) {\n        throw new IllegalArgumentException(\"WordWithDeterminerFilter: Index out of bounds in \"\n            + match.getRule().getFullId() + \", wordFrom: \" + posWord);\n      }\n      posDeterminer = Integer.parseInt(determinerFrom);\n      if (posDeterminer < 1 || posDeterminer > patternTokens.length) {\n        throw new IllegalArgumentException(\"WordWithDeterminerFilter: Index out of bounds in \"\n            + match.getRule().getFullId() + \", posDeterminer: \" + posWord);\n      }\n    } else {\n      throw new IllegalArgumentException(\"WordWithDeterminerFilter: undefined parameters wordFrom or determinerFrom in \"\n          + match.getRule().getFullId());\n    }\n    AnalyzedTokenReadings atrDeterminer = patternTokens[posDeterminer - 1];\n    AnalyzedTokenReadings atrWord = patternTokens[posWord - 1];\n    boolean isDeterminerCapitalized = StringTools.isCapitalizedWord(atrDeterminer.getToken());\n    boolean isWordCapitalized = StringTools.isCapitalizedWord(atrWord.getToken());\n    boolean isDeterminerAllupper = StringTools.isAllUppercase(atrDeterminer.getToken())\n        && !atrDeterminer.getToken().equalsIgnoreCase(\"L'\");\n    boolean isWordAllupper = StringTools.isAllUppercase(atrWord.getToken());\n    AnalyzedToken atDeterminer = getAnalyzedToken(atrDeterminer, detPattern);\n    AnalyzedToken atWord = getAnalyzedToken(atrWord, wordPattern);\n    if (atWord == null || atDeterminer == null) {\n      throw new RuntimeException(\n          \"Error analyzing sentence: '\" + match.getSentence().getText() + \"' with rule \" + match.getRule().getFullId());\n    }\n    boolean isNoun = atWord.getPOSTag().startsWith(\"N\") || atWord.getPOSTag().startsWith(\"Z\");\n    boolean isAdjective = atWord.getPOSTag().startsWith(\"J\");\n    // boolean isParticiple = atWord.getPOSTag().startsWith(\"V\");","sourceCodeStart":55,"sourceCodeEnd":91,"githubUrl":"https://github.com/languagetool-org/languagetool/blob/2e990059ce67d5e2a0f7f7ca5d31160c6709df4b/languagetool-language-modules/fr/src/main/java/org/languagetool/rules/fr/WordWithDeterminerFilter.java#L55-L91","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","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."],"exampleFix":"// before\n<filter class=\"org.languagetool.rules.fr.WordWithDeterminerFilter\" args=\"wordFrom:2\"/>\n// after\n<filter class=\"org.languagetool.rules.fr.WordWithDeterminerFilter\" args=\"wordFrom:2 determinerFrom:1\"/>","handlingStrategy":"validation","validationCode":"if (!attrs.containsKey(\"wordFrom\") || !attrs.containsKey(\"determinerFrom\"))\n  throw new IllegalArgumentException(\"WordWithDeterminerFilter requires wordFrom and determinerFrom\");","typeGuard":null,"tryCatchPattern":"try { filter.acceptRuleMatch(match); } catch (IllegalArgumentException e) { reportMissingFilterArgs(e.getMessage()); }","preventionTips":["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"],"tags":["java","languagetool","rule-configuration","french"],"backgroundTag":"missing-required-argument","analyzedSha":"2e990059ce67d5e2a0f7f7ca5d31160c6709df4b","analyzedAt":"2026-09-06T09:20:17.015Z","contentChangedAt":"2026-09-06T09:20:17.015Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}