diff --git a/crates/language/src/language.rs b/crates/language/src/language.rs index e2c1cc7089..1b1967d08d 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 f5f06320e7..e22abe6d70 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 32e08c1cd9..460ee0e0fd 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 e3869f88a6..c4a91c20b0 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 5f1e44b0a8..796c8f67fa 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 f7c8b80a90..3cd377ce0b 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 254f929053..ca115622c6 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 4490e7d0a8..43b21a1329 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 37765a3c4c..e685853149 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,