class FindSuggestionsFilter extends AbstractFindSuggestionsFilter {

  private static final Pattern ENDS_IN_VOWEL = Pattern.compile("[aeioué]$");
  private static final Pattern PATTERN = Pattern.compile("^[smntl]'|^(nous|vous|le|la|les|me|te|se|leur|en|y) ");

  private static MorfologikFrenchSpellerRule morfologikRule;
  
  public FindSuggestionsFilter() throws IOException {
    if (morfologikRule == null) {
      ResourceBundle messages = JLanguageTool.getDataBroker().getResourceBundle(JLanguageTool.MESSAGE_BUNDLE,
          new Locale("fr"));
      morfologikRule = new MorfologikFrenchSpellerRule(messages, new French(), null, Collections.emptyList());
    }
  }

  @Override
  protected Tagger getTagger() {
    return FrenchTagger.INSTANCE;
  }
  
  @Override
  protected Synthesizer getSynthesizer() {
    return FrenchSynthesizer.INSTANCE;
  }

  @Override
  protected List<String> getSpellingSuggestions(AnalyzedTokenReadings atr) throws IOException {<FILL_FUNCTION_BODY>}
  
  @Override
  protected String cleanSuggestion(String s) {
    //remove pronouns before verbs
    String output = PATTERN.matcher(s).replaceAll("");
    //check only first element 
    output = output.split(" ")[0];
    return output;
  }

}

    String w;
    if (atr.isTagged()) {
      w = StringTools.makeWrong(atr.getToken());
    } else {
      w = atr.getToken();
    }
    List<String> suggestions = new ArrayList<>();
    List<String> wordsToCheck = new ArrayList<>();
    wordsToCheck.add(w);
    if (w.endsWith("s")) {
      wordsToCheck.add(w.substring(0, w.length() - 1));
    }
    if (ENDS_IN_VOWEL.matcher(w).matches()) {
      wordsToCheck.add(w + "s");
    }
    for (String word : wordsToCheck) {
      AnalyzedTokenReadings[] atk = new AnalyzedTokenReadings[1];
      AnalyzedToken token = new AnalyzedToken(word, null, null);
      atk[0] = new AnalyzedTokenReadings(token);
      AnalyzedSentence sentence = new AnalyzedSentence(atk);
      RuleMatch[] matches = morfologikRule.match(sentence);
      if (matches.length > 0) {
        suggestions.addAll(matches[0].getSuggestedReplacements());
      }  
    }
    return suggestions;
  
<methods>public non-sealed void <init>() ,public org.languagetool.rules.RuleMatch acceptRuleMatch(org.languagetool.rules.RuleMatch, Map<java.lang.String,java.lang.String>, int, org.languagetool.AnalyzedTokenReadings[], List<java.lang.Integer>) throws java.io.IOException<variables>protected final int MAX_SUGGESTIONS