Fix Prettier parser values when formatting files with paths (#13666)

Kirill Bulatov created

Closes https://github.com/zed-industries/zed/issues/13660

Now, as intended, the parser value is passed only if configured in the
language settings.

Also, allows to format JSONC by default with Prettier and reformats Zed
settings.

Release Notes:

- Fixed Zed Prettier integration always passing parser value for files
with paths ([13660](https://github.com/zed-industries/zed/issues/13660))

Change summary

assets/settings/default.json    | 14 ++++++--------
crates/prettier/src/prettier.rs | 11 +++++++----
2 files changed, 13 insertions(+), 12 deletions(-)

Detailed changes

assets/settings/default.json 🔗

@@ -131,14 +131,7 @@
   // The default number of lines to expand excerpts in the multibuffer by.
   "expand_excerpt_lines": 3,
   // Globs to match against file paths to determine if a file is private.
-  "private_files": [
-    "**/.env*",
-    "**/*.pem",
-    "**/*.key",
-    "**/*.cert",
-    "**/*.crt",
-    "**/secrets.yml"
-  ],
+  "private_files": ["**/.env*", "**/*.pem", "**/*.key", "**/*.cert", "**/*.crt", "**/secrets.yml"],
   // Whether to use additional LSP queries to format (and amend) the code after
   // every "trigger" symbol input, defined by LSP server capabilities.
   "use_on_type_format": true,
@@ -758,6 +751,11 @@
         "allowed": true
       }
     },
+    "JSONC": {
+      "prettier": {
+        "allowed": true
+      }
+    },
     "Markdown": {
       "format_on_save": "off",
       "prettier": {

crates/prettier/src/prettier.rs 🔗

@@ -317,11 +317,14 @@ impl Prettier {
                             })
                             .collect();
 
-                        let prettier_parser = prettier_settings.parser.as_deref().or_else(|| buffer_language.and_then(|language| language.prettier_parser_name()));
+                        let mut prettier_parser = prettier_settings.parser.as_deref();
+                        if buffer_path.is_none() {
+                            prettier_parser = prettier_parser.or_else(|| buffer_language.and_then(|language| language.prettier_parser_name()));
+                            if prettier_parser.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"));
+                            }
 
-                        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"));
                         }
 
                         log::debug!(