private void popBlock(int pendingTextStart, int startPosition, int startColumn) {
            parser.expect('/');
            String name = parseArgumentName();
            parser.expect('}');

            if (blocks.size() == 1) {
                throw new IllegalArgumentException("Attempted to close unopened tag: '" + name + "'");
            }

            handleConditionalOnLine(pendingTextStart, startPosition, startColumn);

            BlockOperation block = blocks.pop();
            if (!block.variable().equals(name)) {
                throw new IllegalArgumentException("Invalid closing tag: '" + name + "'. Expected: '"
                        + block.variable() + "'");
            }

            blocks.getFirst().push(block);
        }
A BlockOperation that repeats a template for each value referenced by the block. Each iteration pushes
a state to the writer that includes key, value, key.first, and key.last context properties. The name
of the context property can be customized in the template.
smithy-utils/src/main/java/software/amazon/smithy/utils/CodeFormatter.java