private Map<ShapeId, OperationShape> mapIoShapesToOperations(Model model) {
        // Map input and output structures to their containing shapes. These will be
        // documented alongside their associated operations, so we need said operations
        // when generating symbols for them. Pre-computing this mapping is a bit faster
        // than just running a selector every time we hit an IO
        // shape.
        var operationIoMap = new HashMap<ShapeId, OperationShape>();
        var operationIndex = OperationIndex.of(model);
        for (var operation : model.getOperationShapes()) {
            operationIndex.getInputShape(operation)
                    .filter(i -> i.hasTrait(InputTrait.ID))
                    .ifPresent(i -> operationIoMap.put(i.getId(), operation));
            operationIndex.getOutputShape(operation)
                    .filter(i -> i.hasTrait(OutputTrait.ID))
                    .ifPresent(i -> operationIoMap.put(i.getId(), operation));
        }
        return Map.copyOf(operationIoMap);
    }
Constructor.

@param model The model to provide symbols for.
@param docSettings Settings used to customize symbol creation.
smithy-docgen/src/main/java/software/amazon/smithy/docgen/DocSymbolProvider.java