AbstractBlockWrapper (final @NotNull AbstractBlockWrapper block) { if (!(block instanceof CompositeBlockWrapper)) { return block; } AbstractBlockWrapper result = block; AbstractBlockWrapper candidate = block; while (true) { List<AbstractBlockWrapper> subBlocks = ((CompositeBlockWrapper)candidate).getChildren(); if (subBlocks == null || subBlocks.size() != 1) { break; } candidate = subBlocks.get(0); if (candidate.getStartOffset() == block.getStartOffset() && candidate.getEndOffset() == block.getEndOffset() && candidate instanceof CompositeBlockWrapper) { result = candidate; } else { break; } } return result; }