in web/jscs/src/main/java/com/intellij/lang/javascript/linter/jscs/config/JscsConfigFileAnnotator.java [188:242]
private static boolean isObjectLiteral(@NotNull Map<ValueType, JscsOptionDescriptor.ValueDescription> map,
@NotNull ProblemSink holder,
@NotNull JsonValue value,
@NotNull String parentName,
@NotNull Set<? super JsonProperty> visited) {
final JsonObject jsonObj = ObjectUtils.tryCast(value, JsonObject.class);
if (jsonObj == null) return false;
final JscsOptionDescriptor.ValueDescription valDescriptor = map.get(ValueType.obj);
if (valDescriptor.equals(JscsOptionDescriptor.ValueDescription.NO_VALIDATION)) return true;
final JscsOptionDescriptor.ValuesObject descriptor = (JscsOptionDescriptor.ValuesObject)valDescriptor;
final String mandatory = descriptor.getMandatory();
if (mandatory != null) {
if (jsonObj.findProperty(mandatory) == null) {
createWarningAnnotation(holder, value, "Required property '" + mandatory + "' should be defined");
}
}
if (descriptor.isMustNotBeEmpty()) {
if (jsonObj.getPropertyList().isEmpty()) {
createWarningAnnotation(holder, value, "At least one of the properties should be defined");
}
}
iterateOptions(jsonObj, holder, new OptionChecker<Object>() {
@Override
public Object isValidName(@NotNull String name) {
return descriptor.getFields().containsKey(name.trim()) ? true : null;
}
@Override
public void processOption(@NotNull JsonProperty property, @NotNull Object parsedOption, @NotNull ProblemSink holder) {
final String trim = property.getName().trim();
final JscsOptionDescriptor field = descriptor.getFields().get(trim);
if (field == null) return;
JsonValue value = property.getValue();
if (value == null) return;
final List<ValueType> types = new ArrayList<>(field.getTypes().keySet());
if (field.canBe(ValueType.bool) && isBooleanLiteral(types, holder, value)) return;
if (field.canBe(ValueType.true_or_false) && isTrueOrFalse(value)) return;
if (customValidation(field.getTypes(), types, value, holder)) return;
if (field.canBe(ValueType.num_int) && isIntLiteral(types, holder, value)) return;
if (field.canBe(ValueType.str) && isStringLiteral(field.getTypes(), types, holder, value)) return;
if (field.canBe(ValueType.array) && isArray(field.getTypes(), holder, value, null)) return;
if (field.canBe(ValueType.obj) && isObjectLiteral(field.getTypes(), holder, value, trim, visited)) return;
createExpectedTypesAnnotation(types, holder, value);
}
@NotNull
@Override
public String getOptionClassName() {
return parentName;
}
}, visited);
return true;
}