diff options
Diffstat (limited to 'cli/lsp')
-rw-r--r-- | cli/lsp/analysis.rs | 4 | ||||
-rw-r--r-- | cli/lsp/config.rs | 28 | ||||
-rw-r--r-- | cli/lsp/diagnostics.rs | 26 |
3 files changed, 53 insertions, 5 deletions
diff --git a/cli/lsp/analysis.rs b/cli/lsp/analysis.rs index 9c7025781..f60f2e044 100644 --- a/cli/lsp/analysis.rs +++ b/cli/lsp/analysis.rs @@ -9,6 +9,7 @@ use super::tsc; use crate::args::jsr_url; use crate::tools::lint::create_linter; +use deno_lint::linter::LintConfig; use deno_runtime::fs_util::specifier_to_file_path; use deno_ast::SourceRange; @@ -169,9 +170,10 @@ fn as_lsp_range( pub fn get_lint_references( parsed_source: &deno_ast::ParsedSource, lint_rules: Vec<&'static dyn LintRule>, + lint_config: LintConfig, ) -> Result<Vec<Reference>, AnyError> { let linter = create_linter(lint_rules); - let lint_diagnostics = linter.lint_with_ast(parsed_source); + let lint_diagnostics = linter.lint_with_ast(parsed_source, lint_config); Ok( lint_diagnostics diff --git a/cli/lsp/config.rs b/cli/lsp/config.rs index 364999cff..02f3d5afb 100644 --- a/cli/lsp/config.rs +++ b/cli/lsp/config.rs @@ -24,6 +24,7 @@ use deno_core::serde_json; use deno_core::serde_json::json; use deno_core::serde_json::Value; use deno_core::ModuleSpecifier; +use deno_lint::linter::LintConfig; use deno_lockfile::Lockfile; use deno_npm::npm_rc::ResolvedNpmRc; use deno_runtime::deno_node::PackageJson; @@ -1055,6 +1056,9 @@ impl Default for LspTsConfig { "target": "esnext", "useDefineForClassFields": true, "useUnknownInCatchVariables": false, + "jsx": "react", + "jsxFactory": "React.createElement", + "jsxFragmentFactory": "React.Fragment", })), } } @@ -1087,6 +1091,7 @@ pub struct ConfigData { pub config_file: Option<Arc<ConfigFile>>, pub fmt_options: Arc<FmtOptions>, pub lint_options: Arc<LintOptions>, + pub lint_config: LintConfig, pub lint_rules: Arc<ConfiguredRules>, pub ts_config: Arc<LspTsConfig>, pub byonm: bool, @@ -1253,6 +1258,28 @@ impl ConfigData { let ts_config = LspTsConfig::new(config_file.as_ref()); + let lint_config = if ts_config.inner.0.get("jsx").and_then(|v| v.as_str()) + == Some("react") + { + let default_jsx_factory = + ts_config.inner.0.get("jsxFactory").and_then(|v| v.as_str()); + let default_jsx_fragment_factory = ts_config + .inner + .0 + .get("jsxFragmentFactory") + .and_then(|v| v.as_str()); + deno_lint::linter::LintConfig { + default_jsx_factory: default_jsx_factory.map(String::from), + default_jsx_fragment_factory: default_jsx_fragment_factory + .map(String::from), + } + } else { + deno_lint::linter::LintConfig { + default_jsx_factory: None, + default_jsx_fragment_factory: None, + } + }; + let vendor_dir = config_file.as_ref().and_then(|c| c.vendor_dir_path()); // Load lockfile @@ -1429,6 +1456,7 @@ impl ConfigData { config_file: config_file.map(Arc::new), fmt_options, lint_options, + lint_config, lint_rules, ts_config: Arc::new(ts_config), byonm, diff --git a/cli/lsp/diagnostics.rs b/cli/lsp/diagnostics.rs index 35da778dc..9e54c8106 100644 --- a/cli/lsp/diagnostics.rs +++ b/cli/lsp/diagnostics.rs @@ -38,6 +38,7 @@ use deno_graph::source::ResolutionMode; use deno_graph::Resolution; use deno_graph::ResolutionError; use deno_graph::SpecifierError; +use deno_lint::linter::LintConfig; use deno_lint::rules::LintRule; use deno_runtime::deno_fs; use deno_runtime::deno_node; @@ -804,12 +805,27 @@ fn generate_lint_diagnostics( continue; } let version = document.maybe_lsp_version(); - let (lint_options, lint_rules) = config + let (lint_options, lint_config, lint_rules) = config .tree .scope_for_specifier(specifier) .and_then(|s| config_data_by_scope.get(s)) - .map(|d| (d.lint_options.clone(), d.lint_rules.clone())) - .unwrap_or_default(); + .map(|d| { + ( + d.lint_options.clone(), + d.lint_config.clone(), + d.lint_rules.clone(), + ) + }) + .unwrap_or_else(|| { + ( + Arc::default(), + LintConfig { + default_jsx_factory: None, + default_jsx_fragment_factory: None, + }, + Arc::default(), + ) + }); diagnostics_vec.push(DiagnosticRecord { specifier: specifier.clone(), versioned: VersionedDiagnostics { @@ -817,6 +833,7 @@ fn generate_lint_diagnostics( diagnostics: generate_document_lint_diagnostics( &document, &lint_options, + lint_config, lint_rules.rules.clone(), ), }, @@ -828,6 +845,7 @@ fn generate_lint_diagnostics( fn generate_document_lint_diagnostics( document: &Document, lint_options: &LintOptions, + lint_config: LintConfig, lint_rules: Vec<&'static dyn LintRule>, ) -> Vec<lsp::Diagnostic> { if !lint_options.files.matches_specifier(document.specifier()) { @@ -836,7 +854,7 @@ fn generate_document_lint_diagnostics( match document.maybe_parsed_source() { Some(Ok(parsed_source)) => { if let Ok(references) = - analysis::get_lint_references(&parsed_source, lint_rules) + analysis::get_lint_references(&parsed_source, lint_rules, lint_config) { references .into_iter() |