diff --git a/docs/source/1.0/guides/model-linters.rst b/docs/source/1.0/guides/model-linters.rst index 8e85e708fb7..11650885e52 100644 --- a/docs/source/1.0/guides/model-linters.rst +++ b/docs/source/1.0/guides/model-linters.rst @@ -179,7 +179,7 @@ Example: $version: "1.0" metadata validators = [{ - name: "InclusiveWords" + name: "NoninclusiveTerms" configuration: { appendDefaults: true, noninclusiveTerms: { diff --git a/smithy-linters/src/main/java/software/amazon/smithy/linters/AbstractModelTextValidator.java b/smithy-linters/src/main/java/software/amazon/smithy/linters/AbstractModelTextValidator.java deleted file mode 100644 index d4525a21ef5..00000000000 --- a/smithy-linters/src/main/java/software/amazon/smithy/linters/AbstractModelTextValidator.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). - * You may not use this file except in compliance with the License. - * A copy of the License is located at - * - * http://aws.amazon.com/apache2.0 - * - * or in the "license" file accompanying this file. This file is distributed - * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either - * express or implied. See the License for the specific language governing - * permissions and limitations under the License. - */ - -package software.amazon.smithy.linters; - -import java.util.ArrayList; -import java.util.List; -import java.util.function.Consumer; -import software.amazon.smithy.model.Model; -import software.amazon.smithy.model.knowledge.TextIndex; -import software.amazon.smithy.model.knowledge.TextInstance; -import software.amazon.smithy.model.validation.AbstractValidator; -import software.amazon.smithy.model.validation.ValidationEvent; - -/** - *

Base class for any validator that wants to perform a full text search on a Model. - * - *

Does a full scan of the model and gathers all text along with location data - * and uses a generic function to decide what to do with each text occurrence. The - * full text search traversal has no knowledge of what it is looking for and descends - * fully into the structure of all traits. - * - *

Prelude shape definitions are not examined, however all values - */ -abstract class AbstractModelTextValidator extends AbstractValidator { - - /** - * Sub-classes must implement this method to perform the following: - * 1) Decide if the text instance is at a relevant location to validate. - * 2) Analyze the text for whatever validation event it may or may not publish. - * 3) Produce a validation event, if necessary, and push it to the ValidationEvent consumer - * - * @param occurrence text occurrence found in the body of the model - * @param validationEventConsumer consumer to push ValidationEvents into - */ - protected abstract void getValidationEvents(TextInstance occurrence, - Consumer validationEventConsumer); - - /** - * Runs a full text scan on a given model and stores the resulting TextOccurrences objects. - * - * Namespaces are checked against a global set per model. - * - * @param model Model to validate. - * @return a list of ValidationEvents found by the implementer of getValidationEvents per the - * TextOccurrences provided by this traversal. - */ - @Override - public List validate(Model model) { - TextIndex textIndex = TextIndex.of(model); - - List validationEvents = new ArrayList<>(); - for (TextInstance text : textIndex.getTextInstances()) { - getValidationEvents(text, validationEvent -> { - validationEvents.add(validationEvent); - }); - } - return validationEvents; - } -} diff --git a/smithy-linters/src/main/java/software/amazon/smithy/linters/NoninclusiveTermsValidator.java b/smithy-linters/src/main/java/software/amazon/smithy/linters/NoninclusiveTermsValidator.java index d582044f9ab..272230c42b6 100644 --- a/smithy-linters/src/main/java/software/amazon/smithy/linters/NoninclusiveTermsValidator.java +++ b/smithy-linters/src/main/java/software/amazon/smithy/linters/NoninclusiveTermsValidator.java @@ -15,6 +15,7 @@ package software.amazon.smithy.linters; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.ListIterator; @@ -22,10 +23,13 @@ import java.util.Objects; import java.util.function.Consumer; import java.util.function.Function; +import software.amazon.smithy.model.Model; import software.amazon.smithy.model.SourceLocation; +import software.amazon.smithy.model.knowledge.TextIndex; import software.amazon.smithy.model.knowledge.TextInstance; import software.amazon.smithy.model.node.NodeMapper; import software.amazon.smithy.model.traits.Trait; +import software.amazon.smithy.model.validation.AbstractValidator; import software.amazon.smithy.model.validation.Severity; import software.amazon.smithy.model.validation.ValidationEvent; import software.amazon.smithy.model.validation.ValidationUtils; @@ -39,7 +43,7 @@ * * *

See AbstractModelTextValidator for scan implementation details. */ -public final class NoninclusiveTermsValidator extends AbstractModelTextValidator { +public final class NoninclusiveTermsValidator extends AbstractValidator { static final Map> BUILT_IN_NONINCLUSIVE_TERMS = MapUtils.of( "master", ListUtils.of("primary", "parent", "main"), "slave", ListUtils.of("secondary", "replica", "clone", "child"), @@ -94,7 +98,36 @@ private NoninclusiveTermsValidator(Config config) { } } + /** + * Runs a full text scan on a given model and stores the resulting TextOccurrences objects. + * + * Namespaces are checked against a global set per model. + * + * @param model Model to validate. + * @return a list of ValidationEvents found by the implementer of getValidationEvents per the + * TextOccurrences provided by this traversal. + */ @Override + public List validate(Model model) { + TextIndex textIndex = TextIndex.of(model); + List validationEvents = new ArrayList<>(); + for (TextInstance text : textIndex.getTextInstances()) { + getValidationEvents(text, validationEvent -> { + validationEvents.add(validationEvent); + }); + } + return validationEvents; + } + + /** + * Sub-classes must implement this method to perform the following: + * 1) Decide if the text instance is at a relevant location to validate. + * 2) Analyze the text for whatever validation event it may or may not publish. + * 3) Produce a validation event, if necessary, and push it to the ValidationEvent consumer + * + * @param occurrence text occurrence found in the body of the model + * @param validationEventConsumer consumer to push ValidationEvents into + */ protected void getValidationEvents(TextInstance instance, Consumer validationEventConsumer) { for (Map.Entry> termEntry : termsMap.entrySet()) { diff --git a/smithy-model/src/main/java/software/amazon/smithy/model/knowledge/TextIndex.java b/smithy-model/src/main/java/software/amazon/smithy/model/knowledge/TextIndex.java index b766da2d66f..00253db82cc 100644 --- a/smithy-model/src/main/java/software/amazon/smithy/model/knowledge/TextIndex.java +++ b/smithy-model/src/main/java/software/amazon/smithy/model/knowledge/TextIndex.java @@ -32,7 +32,9 @@ import software.amazon.smithy.model.traits.ReferencesTrait; import software.amazon.smithy.model.traits.Trait; import software.amazon.smithy.model.validation.validators.TraitValueValidator; +import software.amazon.smithy.utils.SmithyUnstableApi; +@SmithyUnstableApi public final class TextIndex implements KnowledgeIndex { private List textInstanceList; @@ -74,11 +76,7 @@ private static void getTextInstances(Shape shape, TextInstance.Builder builder = TextInstance.builder() .locationType(TextInstance.TextLocation.SHAPE) .shape(shape); - if (shape.isMemberShape()) { - builder.text(((MemberShape) shape).getMemberName()); - } else { - builder.text(shape.getId().getName()); - } + builder.text(shape.getId().getMember().orElseGet(() -> shape.getId().getName())); textInstances.add(builder.build()); for (Trait trait : shape.getAllTraits().values()) {