@Override
    public void consume(TextRange range) {
      // Tokenization of large texts can produce a lot of tokens, but we are inside RA
      ProgressManager.checkCanceled();
      String word = range.substring(myText);
      if (!myHolder.isOnTheFly() && myAlreadyChecked.contains(word)) {
        return;
      }

      boolean keyword = myNamesValidator.isKeyword(word, myElement.getProject());
      if (keyword) {
        return;
      }

      if (myManager.hasProblem(word)) {
        //Use tokenizer to generate accurate range in element (e.g. in case of escape sequences in element)
        SpellcheckingStrategy strategy = getSpellcheckingStrategy(myElement, myElement.getLanguage());

        Tokenizer<?> tokenizer = strategy != null ? strategy.getTokenizer(myElement) : null;
        if (tokenizer != null) {
          range = tokenizer.getHighlightingRange(myElement, myOffset, range);
        }
        assert range.getStartOffset() >= 0;

        if (myHolder.isOnTheFly()) {
          addRegularDescriptor(myElement, range, myHolder, myUseRename, word);
        }
        else {
          myAlreadyChecked.add(word);
          addBatchDescriptor(myElement, range, word, myHolder);
        }
      }
    }
@Override
    public void consume(TextRange range)