private List<ValidationEvent> scanShapes(Model model) {
        List<ValidationEvent> validationEvents = new ArrayList<>();

        for (Shape shape : model.toSet()) {
            if (shape.isMemberShape()) {
                MemberShape memberShape = (MemberShape) shape;
                Shape containingShape = model.expectShape(memberShape.getContainer());
                Shape targetShape = model.expectShape(memberShape.getTarget());

                if (!containingShape.hasTrait(SensitiveTrait.ID)
                        && !containingShape.isEnumShape()
                        && !targetShape.hasTrait(SensitiveTrait.ID)) {
                    Optional<ValidationEvent> optionalValidationEvent =
                            detectSensitiveTerms(memberShape.getMemberName(), memberShape);
                    optionalValidationEvent.ifPresent(validationEvents::add);
                }
            } else if (!shape.isOperationShape()
                    && !shape.isServiceShape()
                    && !shape.isResourceShape()
                    && !shape.hasTrait(SensitiveTrait.ID)) {
                Optional<ValidationEvent> optionalValidationEvent =
                        detectSensitiveTerms(shape.toShapeId().getName(), shape);
                optionalValidationEvent.ifPresent(validationEvents::add);
            }
        }

        return validationEvents;
    }
Finds shapes without the sensitive trait that possibly contain sensitive data,
based on the shape/member name and the list of key words and phrases.

@param model Model to validate.
@return list of violation events
smithy-linters/src/main/java/software/amazon/smithy/linters/MissingSensitiveTraitValidator.java