Skip to content
This repository has been archived by the owner on Aug 31, 2023. It is now read-only.

Commit

Permalink
chore: create newtype for string sets (#4404)
Browse files Browse the repository at this point in the history
  • Loading branch information
ematipico committed Apr 24, 2023
1 parent 0ce9198 commit fc1fc10
Show file tree
Hide file tree
Showing 19 changed files with 178 additions and 160 deletions.
2 changes: 1 addition & 1 deletion .editorconfig
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ indent_size = 2

# YAML doesn't support hard tabs 🙃
# Templates that will be weird with hard tabs in the website editor
[{**.yml, **.md, **.rs, **.mdx}]
[{**.yml, **.md, **.rs, **.mdx, justfile}]
indent_style = space

[*.rs]
Expand Down
5 changes: 2 additions & 3 deletions crates/rome_cli/src/vcs.rs
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
use crate::diagnostics::{DisabledVcs, NoVcsFolderFound};
use crate::{CliDiagnostic, CliSession};
use indexmap::IndexSet;
use rome_console::{markup, ConsoleExt};
use rome_diagnostics::PrintDiagnostic;
use rome_service::configuration::vcs::{VcsClientKind, VcsConfiguration};
use rome_service::configuration::FilesConfiguration;
use rome_service::configuration::{FilesConfiguration, StringSet};
use rome_service::{Configuration, WorkspaceError};
use std::path::PathBuf;

Expand Down Expand Up @@ -40,7 +39,7 @@ pub(crate) fn store_path_to_ignore_from_vcs(
let files = configuration
.files
.get_or_insert_with(FilesConfiguration::default);
let ignored_files = files.ignore.get_or_insert_with(IndexSet::new);
let ignored_files = files.ignore.get_or_insert_with(StringSet::default);
ignored_files.extend(files_to_ignore.into_iter());
}
}
Expand Down
14 changes: 5 additions & 9 deletions crates/rome_service/src/configuration/formatter.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use crate::configuration::string_set::StringSet;
use crate::settings::FormatSettings;
use crate::{ConfigurationDiagnostic, MatchOptions, Matcher, WorkspaceError};
use indexmap::IndexSet;
use rome_formatter::{IndentStyle, LineWidth};
use serde::{Deserialize, Serialize};

Expand Down Expand Up @@ -30,12 +30,8 @@ pub struct FormatterConfiguration {

/// A list of Unix shell style patterns. The formatter will ignore files/folders that will
/// match these patterns.
#[serde(
skip_serializing_if = "Option::is_none",
deserialize_with = "crate::deserialize_set_of_strings",
serialize_with = "crate::serialize_set_of_strings"
)]
pub ignore: Option<IndexSet<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub ignore: Option<StringSet>,
}

impl FormatterConfiguration {
Expand Down Expand Up @@ -76,8 +72,8 @@ impl TryFrom<FormatterConfiguration> for FormatSettings {
require_literal_separator: false,
});
if let Some(ignore) = conf.ignore {
for pattern in ignore {
matcher.add_pattern(&pattern).map_err(|err| {
for pattern in ignore.index_set() {
matcher.add_pattern(pattern).map_err(|err| {
WorkspaceError::Configuration(
ConfigurationDiagnostic::new_invalid_ignore_pattern(
pattern.to_string(),
Expand Down
10 changes: 3 additions & 7 deletions crates/rome_service/src/configuration/javascript.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use indexmap::IndexSet;
use crate::configuration::string_set::StringSet;
use rome_js_formatter::context::{
trailing_comma::TrailingComma, QuoteProperties, QuoteStyle, Semicolons,
};
Expand All @@ -14,12 +14,8 @@ pub struct JavascriptConfiguration {
/// A list of global bindings that should be ignored by the analyzers
///
/// If defined here, they should not emit diagnostics.
#[serde(
skip_serializing_if = "Option::is_none",
deserialize_with = "crate::deserialize_set_of_strings",
serialize_with = "crate::serialize_set_of_strings"
)]
pub globals: Option<IndexSet<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub globals: Option<StringSet>,

#[serde(skip_serializing_if = "Option::is_none")]
pub organize_imports: Option<JavascriptOrganizeImports>,
Expand Down
14 changes: 5 additions & 9 deletions crates/rome_service/src/configuration/linter/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@
mod rules;

pub use crate::configuration::linter::rules::Rules;
use crate::configuration::string_set::StringSet;
use crate::settings::LinterSettings;
use crate::{ConfigurationDiagnostic, MatchOptions, Matcher, WorkspaceError};
use indexmap::IndexSet;
use rome_diagnostics::Severity;
pub use rules::*;
#[cfg(feature = "schemars")]
Expand All @@ -24,12 +24,8 @@ pub struct LinterConfiguration {

/// A list of Unix shell style patterns. The formatter will ignore files/folders that will
/// match these patterns.
#[serde(
skip_serializing_if = "Option::is_none",
deserialize_with = "crate::deserialize_set_of_strings",
serialize_with = "crate::serialize_set_of_strings"
)]
pub ignore: Option<IndexSet<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub ignore: Option<StringSet>,
}

impl LinterConfiguration {
Expand All @@ -56,8 +52,8 @@ impl TryFrom<LinterConfiguration> for LinterSettings {
require_literal_separator: false,
});
if let Some(ignore) = conf.ignore {
for pattern in ignore {
matcher.add_pattern(&pattern).map_err(|err| {
for pattern in ignore.index_set() {
matcher.add_pattern(pattern).map_err(|err| {
WorkspaceError::Configuration(
ConfigurationDiagnostic::new_invalid_ignore_pattern(
pattern.to_string(),
Expand Down
78 changes: 4 additions & 74 deletions crates/rome_service/src/configuration/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,10 @@
//! by language. The language might further options divided by tool.

use crate::{DynRef, WorkspaceError};
use indexmap::IndexSet;
use rome_fs::{FileSystem, OpenOptions};
use serde::de::{SeqAccess, Visitor};
use serde::ser::SerializeSeq;
use serde::{Deserialize, Serialize};
use std::fmt::Debug;
use std::io::ErrorKind;
use std::marker::PhantomData;
use std::num::NonZeroU64;
use std::path::{Path, PathBuf};

Expand All @@ -22,11 +18,13 @@ mod javascript;
pub mod linter;
pub mod organize_imports;
mod parse;
pub mod string_set;
pub mod vcs;

pub use crate::configuration::diagnostics::ConfigurationDiagnostic;
use crate::configuration::generated::push_to_analyzer_rules;
use crate::configuration::organize_imports::OrganizeImports;
pub use crate::configuration::string_set::StringSet;
use crate::configuration::vcs::VcsConfiguration;
use crate::settings::{LanguagesSettings, LinterSettings};
pub use formatter::{FormatterConfiguration, PlainIndentStyle};
Expand Down Expand Up @@ -135,12 +133,8 @@ pub struct FilesConfiguration {

/// A list of Unix shell style patterns. Rome tools will ignore files/folders that will
/// match these patterns.
#[serde(
skip_serializing_if = "Option::is_none",
deserialize_with = "crate::deserialize_set_of_strings",
serialize_with = "crate::serialize_set_of_strings"
)]
pub ignore: Option<IndexSet<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub ignore: Option<StringSet>,
}

impl FilesConfiguration {
Expand Down Expand Up @@ -257,70 +251,6 @@ pub fn create_config(
Ok(())
}

/// Some documentation
pub fn deserialize_set_of_strings<'de, D>(
deserializer: D,
) -> Result<Option<IndexSet<String>>, D::Error>
where
D: serde::de::Deserializer<'de>,
{
struct IndexVisitor {
marker: PhantomData<fn() -> Option<IndexSet<String>>>,
}

impl IndexVisitor {
fn new() -> Self {
IndexVisitor {
marker: PhantomData,
}
}
}

impl<'de> Visitor<'de> for IndexVisitor {
type Value = Option<IndexSet<String>>;

// Format a message stating what data this Visitor expects to receive.
fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
formatter.write_str("expecting a sequence")
}

fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
where
A: SeqAccess<'de>,
{
let mut index_set = IndexSet::with_capacity(seq.size_hint().unwrap_or(0));

while let Some(value) = seq.next_element()? {
index_set.insert(value);
}

Ok(Some(index_set))
}
}

deserializer.deserialize_seq(IndexVisitor::new())
}

pub fn serialize_set_of_strings<S>(
set_of_strings: &Option<IndexSet<String>>,
s: S,
) -> Result<S::Ok, S::Error>
where
S: serde::ser::Serializer,
{
if let Some(set_of_strings) = set_of_strings {
let mut sequence = s.serialize_seq(Some(set_of_strings.len()))?;
let iter = set_of_strings.into_iter();
for global in iter {
sequence.serialize_element(global)?;
}

sequence.end()
} else {
s.serialize_none()
}
}

/// Converts a [WorkspaceSettings] into a suited [configuration for the analyzer].
///
/// The function needs access to a filter, in order to have an easy access to the [metadata] of the
Expand Down
14 changes: 5 additions & 9 deletions crates/rome_service/src/configuration/organize_imports.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use crate::configuration::string_set::StringSet;
use crate::settings::OrganizeImportsSettings;
use crate::{ConfigurationDiagnostic, MatchOptions, Matcher, WorkspaceError};
use indexmap::IndexSet;
use serde::{Deserialize, Serialize};

#[derive(Debug, Default, Serialize, Deserialize, Eq, PartialEq)]
Expand All @@ -12,12 +12,8 @@ pub struct OrganizeImports {

/// A list of Unix shell style patterns. The formatter will ignore files/folders that will
/// match these patterns.
#[serde(
skip_serializing_if = "Option::is_none",
deserialize_with = "crate::deserialize_set_of_strings",
serialize_with = "crate::serialize_set_of_strings"
)]
pub ignore: Option<IndexSet<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub ignore: Option<StringSet>,
}

impl TryFrom<OrganizeImports> for OrganizeImportsSettings {
Expand All @@ -30,8 +26,8 @@ impl TryFrom<OrganizeImports> for OrganizeImportsSettings {
require_literal_separator: false,
});
if let Some(ignore) = organize_imports.ignore {
for pattern in ignore {
matcher.add_pattern(&pattern).map_err(|err| {
for pattern in ignore.index_set() {
matcher.add_pattern(pattern).map_err(|err| {
WorkspaceError::Configuration(
ConfigurationDiagnostic::new_invalid_ignore_pattern(
pattern.to_string(),
Expand Down
5 changes: 4 additions & 1 deletion crates/rome_service/src/configuration/parse/json/files.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
use crate::configuration::string_set::StringSet;
use crate::configuration::FilesConfiguration;
use rome_deserialize::json::{has_only_known_keys, VisitJsonNode};
use rome_deserialize::{DeserializationDiagnostic, VisitNode};
Expand Down Expand Up @@ -30,7 +31,9 @@ impl VisitNode<JsonLanguage> for FilesConfiguration {
NonZeroU64::new(self.map_to_u64(&value, name_text, u64::MAX, diagnostics)?);
}
"ignore" => {
self.ignore = self.map_to_index_set_string(&value, name_text, diagnostics);
self.ignore = self
.map_to_index_set_string(&value, name_text, diagnostics)
.map(StringSet::new);
}
_ => {}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
use crate::configuration::string_set::StringSet;
use crate::configuration::{FormatterConfiguration, PlainIndentStyle};
use rome_console::markup;
use rome_deserialize::json::{has_only_known_keys, with_only_known_variants, VisitJsonNode};
Expand Down Expand Up @@ -33,7 +34,9 @@ impl VisitNode<JsonLanguage> for FormatterConfiguration {
self.enabled = self.map_to_boolean(&value, name_text, diagnostics)?;
}
"ignore" => {
self.ignore = self.map_to_index_set_string(&value, name_text, diagnostics);
self.ignore = self
.map_to_index_set_string(&value, name_text, diagnostics)
.map(StringSet::new);
}
"indentStyle" => {
let mut indent_style = PlainIndentStyle::default();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
use crate::configuration::javascript::JavascriptOrganizeImports;
use crate::configuration::string_set::StringSet;
use crate::configuration::{JavascriptConfiguration, JavascriptFormatter};
use rome_deserialize::json::{has_only_known_keys, VisitJsonNode};
use rome_deserialize::{DeserializationDiagnostic, VisitNode};
Expand Down Expand Up @@ -34,7 +35,9 @@ impl VisitNode<JsonLanguage> for JavascriptConfiguration {
self.formatter = Some(javascript_formatter);
}
"globals" => {
self.globals = self.map_to_index_set_string(&value, name_text, diagnostics);
self.globals = self
.map_to_index_set_string(&value, name_text, diagnostics)
.map(StringSet::new);
}
"organizeImports" => {
let mut javascript_organize_imports = JavascriptOrganizeImports::default();
Expand Down
5 changes: 4 additions & 1 deletion crates/rome_service/src/configuration/parse/json/linter.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
use crate::configuration::linter::{RulePlainConfiguration, RuleWithOptions};
use crate::configuration::string_set::StringSet;
use crate::configuration::LinterConfiguration;
use crate::{RuleConfiguration, Rules};
use rome_console::markup;
Expand Down Expand Up @@ -28,7 +29,9 @@ impl VisitNode<JsonLanguage> for LinterConfiguration {
let name_text = name.text();
match name_text {
"ignore" => {
self.ignore = self.map_to_index_set_string(&value, name_text, diagnostics);
self.ignore = self
.map_to_index_set_string(&value, name_text, diagnostics)
.map(StringSet::new);
}
"enabled" => {
self.enabled = self.map_to_boolean(&value, name_text, diagnostics)?;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
use crate::configuration::organize_imports::OrganizeImports;
use crate::configuration::string_set::StringSet;
use rome_deserialize::json::{has_only_known_keys, VisitJsonNode};
use rome_deserialize::{DeserializationDiagnostic, VisitNode};
use rome_json_syntax::{JsonLanguage, JsonSyntaxNode};
Expand Down Expand Up @@ -28,7 +29,9 @@ impl VisitNode<JsonLanguage> for OrganizeImports {
self.enabled = self.map_to_boolean(&value, name_text, diagnostics)?;
}
"ignore" => {
self.ignore = self.map_to_index_set_string(&value, name_text, diagnostics);
self.ignore = self
.map_to_index_set_string(&value, name_text, diagnostics)
.map(StringSet::new);
}
_ => {}
}
Expand Down
Loading

0 comments on commit fc1fc10

Please sign in to comment.