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()) {