void (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, myHolder); } } }