diff --git a/crates/language/src/language.rs b/crates/language/src/language.rs index e2c1cc70897be47b6d6228a86fd04ba110280857..1b1967d08d2272fd4cd3bcf090e86a7bb85a8e51 100644 --- a/crates/language/src/language.rs +++ b/crates/language/src/language.rs @@ -610,6 +610,10 @@ pub struct LanguageConfig { /// How to soft-wrap long lines of text. #[serde(default)] pub soft_wrap: Option, + /// The name of a Prettier parser that will be used for this language when no file path is available. + /// If there's a parser name in the language settings, that will be used instead. + #[serde(default)] + pub prettier_parser_name: Option, } #[derive(Clone, Debug, Serialize, Deserialize, Default, JsonSchema)] @@ -692,9 +696,10 @@ impl Default for LanguageConfig { overrides: Default::default(), word_characters: Default::default(), collapsed_placeholder: Default::default(), - hard_tabs: Default::default(), - tab_size: Default::default(), - soft_wrap: Default::default(), + hard_tabs: None, + tab_size: None, + soft_wrap: None, + prettier_parser_name: None, } } } @@ -1372,6 +1377,10 @@ impl Language { language_name => language_name.to_lowercase(), } } + + pub fn prettier_parser_name(&self) -> Option<&str> { + self.config.prettier_parser_name.as_deref() + } } impl LanguageScope { diff --git a/crates/languages/src/css/config.toml b/crates/languages/src/css/config.toml index f5f06320e7a57bf9c09e9553d7be8650de7e8ae9..e22abe6d7056dc465b6c7b0743cd83deb23d2303 100644 --- a/crates/languages/src/css/config.toml +++ b/crates/languages/src/css/config.toml @@ -11,3 +11,4 @@ brackets = [ ] word_characters = ["-"] block_comment = ["/* ", " */"] +prettier_parser_name = "css" diff --git a/crates/languages/src/javascript/config.toml b/crates/languages/src/javascript/config.toml index 32e08c1cd93e99093071ebc4e6e1a8ced313e949..460ee0e0fdae377b9bfc0192bd4713f96fcbe0bb 100644 --- a/crates/languages/src/javascript/config.toml +++ b/crates/languages/src/javascript/config.toml @@ -17,6 +17,7 @@ brackets = [ word_characters = ["$", "#"] tab_size = 2 scope_opt_in_language_servers = ["tailwindcss-language-server", "emmet-language-server"] +prettier_parser_name = "babel" [overrides.element] line_comments = { remove = true } diff --git a/crates/languages/src/json/config.toml b/crates/languages/src/json/config.toml index e3869f88a6b8ebc704321f96f1541927dc0b88ee..c4a91c20b01862279c871d975c5e0eabad4d29e2 100644 --- a/crates/languages/src/json/config.toml +++ b/crates/languages/src/json/config.toml @@ -9,3 +9,4 @@ brackets = [ { start = "\"", end = "\"", close = true, newline = false, not_in = ["string"] }, ] tab_size = 2 +prettier_parser_name = "json" diff --git a/crates/languages/src/markdown/config.toml b/crates/languages/src/markdown/config.toml index 5f1e44b0a8b09872eace80ebb5590c615cc6bd3b..796c8f67fa8eca11346c8195a56e3e4484abb007 100644 --- a/crates/languages/src/markdown/config.toml +++ b/crates/languages/src/markdown/config.toml @@ -14,3 +14,4 @@ brackets = [ tab_size = 2 soft_wrap = "preferred_line_length" +prettier_parser_name = "markdown" diff --git a/crates/languages/src/tsx/config.toml b/crates/languages/src/tsx/config.toml index f7c8b80a9089faac58cff4419dc692816dfc48f1..3cd377ce0b299fcbdd51015287fe2df32f40f6ef 100644 --- a/crates/languages/src/tsx/config.toml +++ b/crates/languages/src/tsx/config.toml @@ -15,6 +15,7 @@ brackets = [ ] word_characters = ["#", "$"] scope_opt_in_language_servers = ["tailwindcss-language-server", "emmet-language-server"] +prettier_parser_name = "typescript" tab_size = 2 [overrides.element] diff --git a/crates/languages/src/typescript/config.toml b/crates/languages/src/typescript/config.toml index 254f929053f3f3eecaf2d8ed84b8280497ad7084..ca115622c6c4bfa4732b2dee8174e3eaab6435ed 100644 --- a/crates/languages/src/typescript/config.toml +++ b/crates/languages/src/typescript/config.toml @@ -14,4 +14,5 @@ brackets = [ { start = "/*", end = " */", close = true, newline = false, not_in = ["string", "comment"] }, ] word_characters = ["#", "$"] +prettier_parser_name = "typescript" tab_size = 2 diff --git a/crates/languages/src/yaml/config.toml b/crates/languages/src/yaml/config.toml index 4490e7d0a8c8cf4c92892f2b07f85909f721949a..43b21a132984958a98e0279f55924176e5983061 100644 --- a/crates/languages/src/yaml/config.toml +++ b/crates/languages/src/yaml/config.toml @@ -10,4 +10,5 @@ brackets = [ ] increase_indent_pattern = ":\\s*[|>]?\\s*$" +prettier_parser_name = "yaml" tab_size = 2 diff --git a/crates/prettier/src/prettier.rs b/crates/prettier/src/prettier.rs index 37765a3c4c5f697da59af9831f37fea9271e31cf..e6858531496fb22ab81266a008ec38af948c7258 100644 --- a/crates/prettier/src/prettier.rs +++ b/crates/prettier/src/prettier.rs @@ -316,8 +316,10 @@ impl Prettier { }) .collect(); - if prettier_settings.parser.is_none() && buffer_path.is_none() { - log::error!("Formatting unsaved file with prettier failed. No prettier parser configured for language"); + let prettier_parser = prettier_settings.parser.as_deref().or_else(|| buffer_language.and_then(|language| language.prettier_parser_name())); + + if prettier_parser.is_none() && buffer_path.is_none() { + log::error!("Formatting unsaved file with prettier failed. No prettier parser configured for language {buffer_language:?}"); return Err(anyhow!("Cannot determine prettier parser for unsaved file")); } @@ -331,7 +333,7 @@ impl Prettier { anyhow::Ok(FormatParams { text: buffer.text(), options: FormatOptions { - parser: prettier_settings.parser.clone(), + parser: prettier_parser.map(ToOwned::to_owned), plugins, path: buffer_path, prettier_options,