CharSequence (@NotNull CharSequence sourceCode, @NotNull Lexer baseLexer, @NotNull RangeCollector rangeCollector) { StringBuilder result = new StringBuilder(sourceCode.length()); baseLexer.start(sourceCode); TextRange currentRange = TextRange.EMPTY_RANGE; int tokenCounter = 0; while (baseLexer.getTokenType() != null) { if (++tokenCounter % CHECK_PROGRESS_AFTER_TOKENS == 0) { ProgressManager.checkCanceled(); } TextRange newRange = TextRange.create(baseLexer.getTokenStart(), baseLexer.getTokenEnd()); assert currentRange.getEndOffset() == newRange.getStartOffset() : "Inconsistent tokens stream from " + baseLexer + ": " + getRangeDump(currentRange, sourceCode) + " followed by " + getRangeDump(newRange, sourceCode); currentRange = newRange; if (baseLexer.getTokenType() == myTemplateElementType) { appendCurrentTemplateToken(result, sourceCode, baseLexer, rangeCollector); } else { rangeCollector.addOuterRange(currentRange); } baseLexer.advance(); } return result; }