void (@NotNull CharSequence fileText, @NotNull Processor<? super WordOccurrence> processor) { int index = 0; WordOccurrence occurrence = null; final char[] fileTextArray = CharArrayUtil.fromSequenceWithoutCopying(fileText); ScanWordsLoop: while (true) { while (true) { if (index == fileText.length()) break ScanWordsLoop; final char c = fileTextArray != null ? fileTextArray[index]:fileText.charAt(index); if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9') || (Character.isJavaIdentifierStart(c) && c != '$')) { break; } index++; } int index1 = index; while (true) { index++; if (index == fileText.length()) break; final char c = fileTextArray != null ? fileTextArray[index]:fileText.charAt(index); if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9')) continue; if (!Character.isJavaIdentifierPart(c) || c == '$') break; } if (index - index1 > 100) continue; // Strange limit but we should have some! if (occurrence == null) occurrence = new WordOccurrence(fileText, index1, index, null); else occurrence.init(fileText, index1, index, null); processor.process(occurrence); } }