From 7818787b96ef1950338a934fd3298f3ed36693b6 Mon Sep 17 00:00:00 2001 From: Emanuele Stoppa Date: Thu, 18 Jul 2024 15:50:54 +0100 Subject: [PATCH 1/3] fix: enable JSX parsing inside `.vue` files --- CHANGELOG.md | 1 + crates/biome_service/src/file_handlers/vue.rs | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2d87edec410..cbefcc86c46 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -487,6 +487,7 @@ our [guidelines for writing a good changelog entry](https://github.com/biomejs/b } ``` Contributed by @ah-yu +- Fix [#3464](https://github.com/biomejs/biome/issues/3464) by enabling JSX parsing inside `.vue` files. Contributed by @ematipico ## v1.8.3 (2024-06-27) diff --git a/crates/biome_service/src/file_handlers/vue.rs b/crates/biome_service/src/file_handlers/vue.rs index ee9102272a5..2d258e02149 100644 --- a/crates/biome_service/src/file_handlers/vue.rs +++ b/crates/biome_service/src/file_handlers/vue.rs @@ -71,10 +71,10 @@ impl VueFileHandler { .and_then(|captures| { match parse_lang_from_script_opening_tag(captures.name("opening")?.as_str()) { Language::JavaScript => { - Some(JsFileSource::js_module().with_embedding_kind(EmbeddingKind::Vue)) + Some(JsFileSource::jsx().with_embedding_kind(EmbeddingKind::Vue)) } Language::TypeScript { .. } => { - Some(JsFileSource::ts().with_embedding_kind(EmbeddingKind::Vue)) + Some(JsFileSource::tsx().with_embedding_kind(EmbeddingKind::Vue)) } } }) From 08e4c40cf96d872e2e47ef4783873857ef57c831 Mon Sep 17 00:00:00 2001 From: Emanuele Stoppa Date: Tue, 27 Aug 2024 15:41:20 +0100 Subject: [PATCH 2/3] review logic --- CHANGELOG.md | 2 +- crates/biome_js_syntax/src/file_source.rs | 15 +++ crates/biome_service/src/file_handlers/mod.rs | 94 ++++++++++++++++--- .../biome_service/src/file_handlers/svelte.rs | 17 ++-- crates/biome_service/src/file_handlers/vue.rs | 17 ++-- 5 files changed, 113 insertions(+), 32 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cbefcc86c46..b7a3be75cdc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -487,7 +487,7 @@ our [guidelines for writing a good changelog entry](https://github.com/biomejs/b } ``` Contributed by @ah-yu -- Fix [#3464](https://github.com/biomejs/biome/issues/3464) by enabling JSX parsing inside `.vue` files. Contributed by @ematipico +- Fix [#3464](https://github.com/biomejs/biome/issues/3464) by enabling JSX in `.vue` files that use the `lang='jsx'` or `lang='tsx'` attribute. Contributed by @ematipico ## v1.8.3 (2024-06-27) diff --git a/crates/biome_js_syntax/src/file_source.rs b/crates/biome_js_syntax/src/file_source.rs index 33c2717a3ac..285680ea931 100644 --- a/crates/biome_js_syntax/src/file_source.rs +++ b/crates/biome_js_syntax/src/file_source.rs @@ -384,3 +384,18 @@ impl TryFrom<&Path> for JsFileSource { Self::try_from_extension(extension) } } + +impl From for JsFileSource { + fn from(value: Language) -> Self { + match value { + Language::JavaScript => JsFileSource::js_module(), + Language::TypeScript { definition_file } => { + if definition_file { + JsFileSource::d_ts() + } else { + JsFileSource::ts() + } + } + } + } +} diff --git a/crates/biome_service/src/file_handlers/mod.rs b/crates/biome_service/src/file_handlers/mod.rs index 2333389031d..1dd5afcf5b8 100644 --- a/crates/biome_service/src/file_handlers/mod.rs +++ b/crates/biome_service/src/file_handlers/mod.rs @@ -29,7 +29,9 @@ use biome_fs::BiomePath; use biome_graphql_syntax::{GraphqlFileSource, GraphqlLanguage}; use biome_grit_patterns::{GritQuery, GritQueryResult, GritTargetFile}; use biome_js_parser::{parse, JsParserOptions}; -use biome_js_syntax::{EmbeddingKind, JsFileSource, JsLanguage, Language, TextRange, TextSize}; +use biome_js_syntax::{ + EmbeddingKind, JsFileSource, JsLanguage, Language, LanguageVariant, TextRange, TextSize, +}; use biome_json_syntax::{JsonFileSource, JsonLanguage}; use biome_parser::AnyParse; use biome_project::PackageJson; @@ -563,7 +565,9 @@ pub(crate) fn is_diagnostic_error( /// matched by regular expressions. /// // TODO: We should change the parser when HTMLish languages are supported. -pub(crate) fn parse_lang_from_script_opening_tag(script_opening_tag: &str) -> Language { +pub(crate) fn parse_lang_from_script_opening_tag( + script_opening_tag: &str, +) -> (Language, LanguageVariant) { parse( script_opening_tag, JsFileSource::jsx(), @@ -584,14 +588,27 @@ pub(crate) fn parse_lang_from_script_opening_tag(script_opening_tag: &str) -> La let attribute_inner_string = attribute_value.as_jsx_string()?.inner_string_text().ok()?; match attribute_inner_string.text() { - "ts" | "tsx" => Some(Language::TypeScript { - definition_file: false, - }), + "ts" => Some(( + Language::TypeScript { + definition_file: false, + }, + LanguageVariant::Standard, + )), + "tsx" => Some(( + Language::TypeScript { + definition_file: false, + }, + LanguageVariant::Jsx, + )), + "jsx" => Some((Language::JavaScript, LanguageVariant::Jsx)), + "js" => Some((Language::JavaScript, LanguageVariant::Standard)), _ => None, } }) }) - .map_or(Language::JavaScript, |lang| lang) + .map_or((Language::JavaScript, LanguageVariant::Standard), |lang| { + lang + }) } pub(crate) fn search( @@ -630,14 +647,24 @@ fn test_svelte_script_lang() { const SVELTE_CONTEXT_MODULE_TS_SCRIPT_OPENING_TAG: &str = r#"