@Override
    public TokenTree apply(TokenTree tree) {
        TreeCursor useSection = Objects.requireNonNull(tree.zipper().getFirstChild(TreeType.SHAPE_SECTION))
                .getFirstChild(TreeType.USE_SECTION);

        // All trees should have a USE_SECTION. If the section is empty, then no use statements need to be sorted.
        // Note that if it isn't empty, then there is a guaranteed NAMESPACE_STATEMENT too.
        if (useSection == null || useSection.getTree().isEmpty()) {
            return tree;
        }

        UseDataModel dataModel = new UseDataModel(tree.zipper(), useSection);

        // Remove the original statements since they get sorted and re-added.
        useSection.getChildrenByType(TreeType.USE_STATEMENT)
                .forEach(s -> useSection.getTree().removeChild(s.getTree()));

        dataModel.addFirstUse(useSection);
        dataModel.addSubsequentUse(useSection);

        return tree;
    }
Sorts use statements in models alphabetically, case-sensitively.
smithy-syntax/src/main/java/software/amazon/smithy/syntax/SortUseStatements.java